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.
相关阅读
fresh cs master求建议goodbug真是可悲啊问JavaScript大牛一个问题扯扯面试里的非技术因素,从我的跨行业n次面试说起 (转载)不同层次的人没法比Pinterest五个engineer的职位推荐spark RDD不能当K/V store是吧?回国处理了一些事情,回来突然对所有IT的东西反胃谈谈为什么上scala感觉喜欢go的都是被c python蹂躏过的在这里确实发现了很多军版的熟ID在并发上haskell可以秒go吗以为进了菌斑了。月光.古巴根据调研以及好虫建议网络售票网站外包COULD SERVER-SIDE DART REPLACE NODE.JS?纽约投行招人去了Java one 两天的感想。谁能帮我看一下错误在哪里?