c*******h 发帖数: 1096 | 1 假设我有个 Node 类,里面有一个成员变量
Node *next;
用来指向下一个 Node。我从 Node 继承了一个子类,叫 Node1D。我希望 Node1
还是有一个成员变量叫 next,指向下一个 Node1。成员变量不像函数一样可以
virtual,那我应该怎么做呢? |
p*u 发帖数: 2454 | 2
u can simply assign Node1 pointer to next, right?
【在 c*******h 的大作中提到】 : 假设我有个 Node 类,里面有一个成员变量 : Node *next; : 用来指向下一个 Node。我从 Node 继承了一个子类,叫 Node1D。我希望 Node1 : 还是有一个成员变量叫 next,指向下一个 Node1。成员变量不像函数一样可以 : virtual,那我应该怎么做呢?
|
c*******h 发帖数: 1096 | 3 只是写两个next我看着不顺眼
【在 p*u 的大作中提到】 : : u can simply assign Node1 pointer to next, right?
|
p*u 发帖数: 2454 | 4
why do u need 2 next members?? Node::next is not accessible 2 u??
【在 c*******h 的大作中提到】 : 只是写两个next我看着不顺眼
|
T********i 发帖数: 2416 | 5 他帖子里还有个Node1D,真够乱的。我都没看明白。
【在 p*u 的大作中提到】 : : why do u need 2 next members?? Node::next is not accessible 2 u??
|
a***n 发帖数: 538 | 6 这个用virtual function返回member的地址就可以了吧。 |
X****r 发帖数: 3557 | 7 看起来楼主想要使这个成员的类型和类本身covariant,就是
class Node {
protected:
Node *next;
};
class Node1D : public Node {
protected:
Node1D *next;
};
但是这两个next是同一个成员。这个不能直接这样写,但是可以用setter/getter模拟:
class Node {
private:
Node *next;
protected:
Node *getNext() { return next; }
void setNext(Node *newNext) { next = newNext; }
};
class Node1D : public Node {
protected:
Node1D *getNext() { return (Node1D *)Node::getNext(); }
void setNext(Node1D *newNext) { Node::setNext(newNext); }
};
好久没写C++了,语法错了勿怪。
【在 T********i 的大作中提到】 : 他帖子里还有个Node1D,真够乱的。我都没看明白。
|
q*c 发帖数: 9453 | 8 看来还是死了最舒服, 一直躺着, 哈哈。
拟:
【在 X****r 的大作中提到】 : 看起来楼主想要使这个成员的类型和类本身covariant,就是 : class Node { : protected: : Node *next; : }; : class Node1D : public Node { : protected: : Node1D *next; : }; : 但是这两个next是同一个成员。这个不能直接这样写,但是可以用setter/getter模拟:
|
a***n 发帖数: 538 | 9 也可以这样吧。
template
class Node {
public:
T *next;
};
class Node1D : public Node {
}; |
X****r 发帖数: 3557 | 10 嗯,“魂飞九天,魄落九渊,生者悲苦,死人平安。”
【在 q*c 的大作中提到】 : 看来还是死了最舒服, 一直躺着, 哈哈。 : : 拟:
|
|
|
X****r 发帖数: 3557 | 11 对,这样更好,但是C++里不像Java一样可以限定T必须从Node继承,所以Node里操作
next就有类型的麻烦可能需要cast。
【在 a***n 的大作中提到】 : 也可以这样吧。 : template : class Node { : public: : T *next; : }; : class Node1D : public Node { : };
|
p*u 发帖数: 2454 | 12
拟:
no virtual methods??
【在 X****r 的大作中提到】 : 看起来楼主想要使这个成员的类型和类本身covariant,就是 : class Node { : protected: : Node *next; : }; : class Node1D : public Node { : protected: : Node1D *next; : }; : 但是这两个next是同一个成员。这个不能直接这样写,但是可以用setter/getter模拟:
|
X****r 发帖数: 3557 | 13 不用,因为其实是同一个函数类型上哄哄编译器的(最后都不会生成代码)。aaron 用
模板的方法就更清楚了。
【在 p*u 的大作中提到】 : : 拟: : no virtual methods??
|
a***n 发帖数: 538 | 14 返回类型都不一样不能virutal啊。
【在 p*u 的大作中提到】 : : 拟: : no virtual methods??
|
q*c 发帖数: 9453 | 15 不过我佛盛说轮回啊。
所以。。。还是苦练投胎这种真正的高科技。 比老霸老魏那些东西强多了, 呵呵。
【在 X****r 的大作中提到】 : 嗯,“魂飞九天,魄落九渊,生者悲苦,死人平安。”
|
z*******3 发帖数: 13709 | 16 已经投了阿,没有办法了
只能尽可能逼近了
下辈子太远,这辈子还得过
【在 q*c 的大作中提到】 : 不过我佛盛说轮回啊。 : 所以。。。还是苦练投胎这种真正的高科技。 比老霸老魏那些东西强多了, 呵呵。
|
q*c 发帖数: 9453 | 17 若问昔日因, 今生受者是;
若问来日果, 今生做者是。 :)
【在 z*******3 的大作中提到】 : 已经投了阿,没有办法了 : 只能尽可能逼近了 : 下辈子太远,这辈子还得过
|
X****r 发帖数: 3557 | 18 这个我完全赞同。
不过老魏老霸所争至少还有入手处,投胎这种高科技欲努力而不可得啊。
【在 q*c 的大作中提到】 : 不过我佛盛说轮回啊。 : 所以。。。还是苦练投胎这种真正的高科技。 比老霸老魏那些东西强多了, 呵呵。
|
q*c 发帖数: 9453 | 19 haha, 你没有入手处不代表别人没有哦 :)
【在 X****r 的大作中提到】 : 这个我完全赞同。 : 不过老魏老霸所争至少还有入手处,投胎这种高科技欲努力而不可得啊。
|
b*******s 发帖数: 5216 | 20 看样子是一维的点,估计是做图形学的
【在 T********i 的大作中提到】 : 他帖子里还有个Node1D,真够乱的。我都没看明白。
|
|
|
p*u 发帖数: 2454 | 21
Google "virtual constructor"
【在 a***n 的大作中提到】 : 返回类型都不一样不能virutal啊。
|
a***n 发帖数: 538 | 22 c++什么时候可以virtual constructor了?
【在 p*u 的大作中提到】 : : Google "virtual constructor"
|
i******t 发帖数: 22541 | 23 恩 应该是不能虚建吧
【在 a***n 的大作中提到】 : c++什么时候可以virtual constructor了?
|
p*u 发帖数: 2454 | 24
sigh, can't u guys @ least Google a bit???
http://www.parashift.com/c++-faq/virtual-ctors.html
【在 i******t 的大作中提到】 : 恩 应该是不能虚建吧
|
a***n 发帖数: 538 | 25 试了一下,真的可以。
class Node {
protected:
Node* next;
public:
virtual Node* get_next() { // Uses the default constructor
return next;
}
};
class Node1D : public Node {
public:
Node1D* get_next() {
return static_cast(next);
}
};
【在 p*u 的大作中提到】 : : sigh, can't u guys @ least Google a bit??? : http://www.parashift.com/c++-faq/virtual-ctors.html
|
p*u 发帖数: 2454 | 26
a pointer is nothing but a number.
【在 a***n 的大作中提到】 : 试了一下,真的可以。 : class Node { : protected: : Node* next; : public: : virtual Node* get_next() { // Uses the default constructor : return next; : } : }; : class Node1D : public Node {
|
a***n 发帖数: 538 | 27 不过set不行,parameter不支持covariant。
【在 p*u 的大作中提到】 : : a pointer is nothing but a number.
|
N******K 发帖数: 10202 | 28 人肉法
【在 p*u 的大作中提到】 : : a pointer is nothing but a number.
|
p*u 发帖数: 2454 | 29
why do u need covariant for set???
【在 a***n 的大作中提到】 : 不过set不行,parameter不支持covariant。
|
a***n 发帖数: 538 | 30 这里确实不用,get也不用。我只是想说parameter不协变的情况写不出虚函数,而且父
类总是会用自己那个,因为parameter会被自动upper cast。
【在 p*u 的大作中提到】 : : why do u need covariant for set???
|