avatar
请教c++ non-vitura interface# Programming - 葵花宝典
h*i
1
每周3次来家里做晚饭,5:30-7:00左右,能提供简单家务更好,薪酬面议,请站内联
系。
avatar
y*6
2
【 以下文字转载自 History 讨论区 】
发信人: yaz2006 (忘情四百年,快意山水间), 信区: History
标 题: Re: 古人怎么对付近视的?
发信站: BBS 未名空间站 (Thu Sep 24 00:57:32 2009, 美东)
我是用通俗的语言把三种情况都概括了
avatar
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中不也一样吗
avatar
r*g
4
你句话又是哪里抄来的???

基因

【在 y*****6 的大作中提到】
: 【 以下文字转载自 History 讨论区 】
: 发信人: yaz2006 (忘情四百年,快意山水间), 信区: History
: 标 题: Re: 古人怎么对付近视的?
: 发信站: BBS 未名空间站 (Thu Sep 24 00:57:32 2009, 美东)
: 我是用通俗的语言把三种情况都概括了

avatar
t*t
5
我看了一遍, 他讲得挺明白的啊. 我不认为我能讲得比他更明白了

【在 A**u 的大作中提到】
: 在看c++ effective,
: 有点不明白 NVI(non virtual interface idiom)
: 书上的例子
: class B{
: public:
: ~B();
: void run(){do();}
: private:
: virtual void do() const = 0;
: }

avatar
y*6
6
不是抄的

办?

【在 r*********g 的大作中提到】
: 你句话又是哪里抄来的???
:
: 基因

avatar
A*u
7
对不起
我的问题 为什么是virtual
还有 这里没发生动态绑定吧

【在 t****t 的大作中提到】
: 我看了一遍, 他讲得挺明白的啊. 我不认为我能讲得比他更明白了
avatar
r*g
8
你不是说,你没有自己的语言,就是来学习语言艺术的?

【在 y*****6 的大作中提到】
: 不是抄的
:
: 办?

avatar
t*t
9

为什么不是?
这里发生了
你两个问题是一个. 回答是, 是不是private和动态绑定无关, meyers在原书里说得很
清楚了. D::do() will override B::do() even if D can not access B::do(). (BTW
你原贴里忘了把D继承B, 幸好我有书知道你在问什么)

【在 A**u 的大作中提到】
: 对不起
: 我的问题 为什么是virtual
: 还有 这里没发生动态绑定吧

avatar
y*6
10
虽然这句话不是抄的,但是这句话背后的意境是模仿别人的

【在 r*********g 的大作中提到】
: 你不是说,你没有自己的语言,就是来学习语言艺术的?
avatar
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, 幸好我有书知道你在问什么)

avatar
A*s
12
谁的?什么魔板?
你说话能不能别大喘气啊?每次要打听一个信息,总要其他人旁敲侧击换好多种问法。你自
己不累么???

【在 y*****6 的大作中提到】
: 虽然这句话不是抄的,但是这句话背后的意境是模仿别人的
avatar
f*y
13
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{

avatar
y*6
14
不是具体某一个人,很多人都具有这种气质。
我回答问题比流星大哥爽快多了吧?

。你自

【在 A*******s 的大作中提到】
: 谁的?什么魔板?
: 你说话能不能别大喘气啊?每次要打听一个信息,总要其他人旁敲侧击换好多种问法。你自
: 己不累么???

avatar
a*y
15
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;
: }

avatar
A*s
16
不可比
流星想回答的问题,一句话就说清楚了。不想回答的另说。
你呢,不知道是故意不想回答,还是看不懂别人问问题的重点,反正总要挤牙膏。
俗称,交流障碍
顶锅盖逃跑。。。。。

【在 y*****6 的大作中提到】
: 不是具体某一个人,很多人都具有这种气质。
: 我回答问题比流星大哥爽快多了吧?
:
: 。你自

avatar
a*y
17
这里没动态绑定,不等于用的时候没有动态绑定.

【在 A**u 的大作中提到】
: 对不起
: 我的问题 为什么是virtual
: 还有 这里没发生动态绑定吧

avatar
a*y
18
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;
: }

avatar
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();

avatar
a*y
20
这个是动态绑定的基本用法啊.
你的原帖里面,class b里面的do()函数是=0的啊,怎么这儿又变了?

【在 A**u 的大作中提到】
: 你是对的
: class B{
: public:
: ~B();
: void run(){do();}
: private:
: void do(){cout << "B"};
: }
: class D:public B{
: private:

avatar
A*u
21
原来是 = 0;
调用的话没结果
我这里改了,看他到底调用哪个
动态绑定我只用过 public, 一级绑定
这个绑定有些复杂, p->non-virutal->virtual....

【在 a***y 的大作中提到】
: 这个是动态绑定的基本用法啊.
: 你的原帖里面,class b里面的do()函数是=0的啊,怎么这儿又变了?

avatar
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{

avatar
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.

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。