y*6
2 楼
【 以下文字转载自 History 讨论区 】
发信人: yaz2006 (忘情四百年,快意山水间), 信区: History
标 题: Re: 古人怎么对付近视的?
发信站: BBS 未名空间站 (Thu Sep 24 00:57:32 2009, 美东)
我是用通俗的语言把三种情况都概括了
发信人: yaz2006 (忘情四百年,快意山水间), 信区: History
标 题: Re: 古人怎么对付近视的?
发信站: BBS 未名空间站 (Thu Sep 24 00:57:32 2009, 美东)
我是用通俗的语言把三种情况都概括了
A*u
3 楼
在看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中不也一样吗
有点不明白 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中不也一样吗
A*u
11 楼
对,我忘贴了 在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, 幸好我有书知道你在问什么)
我这么定义也是干活的
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, 幸好我有书知道你在问什么)
A*u
19 楼
你是对的
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();
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();
t*t
22 楼
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{
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
23 楼
在搬家折腾
今天才上网
谢谢 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.
今天才上网
谢谢 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.
相关阅读
C++并发和Java并发有多大区别?Linux Makefile: How to include cpp files in subfolder for (转载)angular的最大问题是不能和其它库兼容这版水平怎么这样了。一点破git都不会看tutorial,handbook学懂。现在马农真是次品太多type class是fp吗?看了flink,不能不说有点小期待c++ 里的regex_search为什么比 linux 下的grep慢这么多?搞docker的别忘了lxc/lxdNB的码工,有几个能自己写compiler的问个初级Android问题发现了一个规律阿里系统崩溃,没人讨论下想山寨palantir了APP泡沫即将破灭(转载)GIT如何跟别人share repo?先在除了twitter 还有大量上scala的么?现在 online latex也挺好用了据说金牌卧底被干掉了java 链表里面dummy node 一问?谢谢fangtuo2 4月份发完那贴之后,进去修了bugs没有?