A**u 发帖数: 2458 | 1 在看c++ effective,
有点不明白 NVI(non virtual interface idiom)
书上的例子
class B{
public:
~B();
void run(){do();}
private:
virtual void do() const = 0;
}
class D:public B{
private:
vitural void do(){....}
}
我有些问题
D 不能 访问 B的 private 成员, 所以 D 必须重新定义 private 中的 do 函数,
而且 private的成员, 也不会发生动态绑定,那为什么还需要 virtual呢
void do(){} 在 B 中, void do(){....} 在B中不也一样吗 |
t****t 发帖数: 6806 | 2 我看了一遍, 他讲得挺明白的啊. 我不认为我能讲得比他更明白了
【在 A**u 的大作中提到】 : 在看c++ effective, : 有点不明白 NVI(non virtual interface idiom) : 书上的例子 : class B{ : public: : ~B(); : void run(){do();} : private: : virtual void do() const = 0; : }
|
A**u 发帖数: 2458 | 3 对不起
我的问题 为什么是virtual
还有 这里没发生动态绑定吧
【在 t****t 的大作中提到】 : 我看了一遍, 他讲得挺明白的啊. 我不认为我能讲得比他更明白了
|
t****t 发帖数: 6806 | 4
为什么不是?
这里发生了
你两个问题是一个. 回答是, 是不是private和动态绑定无关, meyers在原书里说得很
清楚了. D::do() will override B::do() even if D can not access B::do(). (BTW
你原贴里忘了把D继承B, 幸好我有书知道你在问什么)
【在 A**u 的大作中提到】 : 对不起 : 我的问题 为什么是virtual : 还有 这里没发生动态绑定吧
|
A**u 发帖数: 2458 | 5 对,我忘贴了 在effective c++ 183 页
我这么定义也是干活的
class B{
public:
~B();
void run(){do();}
private:
void do(){};
}
class D:public B{
private:
void do(){....}
}
我这这么想的,
do() 在private里,D肯定不能访问, 所以无论如何, D里必须自己定义一个do函数.
D d;
d.run();
run()里会搜索do()函数,先在D里找,找不到再去B中
没有virtural下,D.run() 在D中找到private 中的do()
如果有virtual do(), 发生的事情,也是一样
所以,为什么要virtual呢,还增加cost
BTW
【在 t****t 的大作中提到】 : : 为什么不是? : 这里发生了 : 你两个问题是一个. 回答是, 是不是private和动态绑定无关, meyers在原书里说得很 : 清楚了. D::do() will override B::do() even if D can not access B::do(). (BTW : 你原贴里忘了把D继承B, 幸好我有书知道你在问什么)
|
f******y 发帖数: 2971 | 6 If you have a pointer to base class, it cannot find the right do function.
B* b = new D();
b->run();
【在 A**u 的大作中提到】 : 对,我忘贴了 在effective c++ 183 页 : 我这么定义也是干活的 : class B{ : public: : ~B(); : void run(){do();} : private: : void do(){}; : } : class D:public B{
|
a***y 发帖数: 2803 | 7 virtual void do() const = 0; 是一個pure virtual function.纯爷们,纯的.
所以在derived class里面必须定义這個do()function.
【在 A**u 的大作中提到】 : 在看c++ effective, : 有点不明白 NVI(non virtual interface idiom) : 书上的例子 : class B{ : public: : ~B(); : void run(){do();} : private: : virtual void do() const = 0; : }
|
a***y 发帖数: 2803 | 8 这里没动态绑定,不等于用的时候没有动态绑定.
【在 A**u 的大作中提到】 : 对不起 : 我的问题 为什么是virtual : 还有 这里没发生动态绑定吧
|
a***y 发帖数: 2803 | 9 class B里面的run()函数,调用pure virtual function do()不会引起syntax error吗?
【在 A**u 的大作中提到】 : 在看c++ effective, : 有点不明白 NVI(non virtual interface idiom) : 书上的例子 : class B{ : public: : ~B(); : void run(){do();} : private: : virtual void do() const = 0; : }
|
A**u 发帖数: 2458 | 10 你是对的
class B{
public:
~B();
void run(){do();}
private:
void do(){cout << "B"};
}
class D:public B{
private:
void do(){cout << "D"}
}
B* p = new D;
p->run() 显示 B.
class B{
public:
~B();
void run(){do();}
private:
virtual void do(){cout << "B"};
}
class D:public B{
private:
virtual void do(){cout << "D"}
}
B*p = new D;
p->run() 显示 D
【在 f******y 的大作中提到】 : If you have a pointer to base class, it cannot find the right do function. : B* b = new D(); : b->run();
|
a***y 发帖数: 2803 | 11 这个是动态绑定的基本用法啊.
你的原帖里面,class b里面的do()函数是=0的啊,怎么这儿又变了?
【在 A**u 的大作中提到】 : 你是对的 : class B{ : public: : ~B(); : void run(){do();} : private: : void do(){cout << "B"}; : } : class D:public B{ : private:
|
A**u 发帖数: 2458 | 12 原来是 = 0;
调用的话没结果
我这里改了,看他到底调用哪个
动态绑定我只用过 public, 一级绑定
这个绑定有些复杂, p->non-virutal->virtual....
【在 a***y 的大作中提到】 : 这个是动态绑定的基本用法啊. : 你的原帖里面,class b里面的do()函数是=0的啊,怎么这儿又变了?
|
t****t 发帖数: 6806 | 13 there is no D::run(), so when you write d.run(), it calls B::run()
then B::run will call B::do(), which is virtual and overriden by D::do().
if B::do() is not virtual, B::run will call B::do(), not D::do(), no matter
the calling object is B or D. that's virtual function 101.
【在 A**u 的大作中提到】 : 对,我忘贴了 在effective c++ 183 页 : 我这么定义也是干活的 : class B{ : public: : ~B(); : void run(){do();} : private: : void do(){}; : } : class D:public B{
|
A**u 发帖数: 2458 | 14 在搬家折腾
今天才上网
谢谢 thrust,finalguy,araby
现在明白了
matter
【在 t****t 的大作中提到】 : there is no D::run(), so when you write d.run(), it calls B::run() : then B::run will call B::do(), which is virtual and overriden by D::do(). : if B::do() is not virtual, B::run will call B::do(), not D::do(), no matter : the calling object is B or D. that's virtual function 101.
|