由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教c++ non-vitura interface
相关主题
go的抽象能力确实比较差A C++ inheritance question!
c++里的函数可不可以是virtual+staticC++小插曲
effective C++里的memory pool 一问:[合集] 一道C++面试题 (转载)
问个 C++到C的问题[合集] C++ virtual function的一个问题。。
C++ 弱问一个请问c++中操作符可以声明为虚函数吗?
请问c++为什么会编译失败?虚函数access权限改变问题
A C++ private member function problem[合集] 基类函数已经是virtual了,为啥子类还要virtual啊?
请教 C++的一个困惑 (operator delete)C++问题
相关话题的讨论汇总
话题: do话题: void话题: virtual话题: private话题: run
进入Programming版参与讨论
1 (共1页)
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.

1 (共1页)
进入Programming版参与讨论
相关主题
C++问题C++ 弱问一个
为什么derived object没有vptr? 请问c++为什么会编译失败?
听说pointer to member function只支持最多128个virtual functiA C++ private member function problem
问一个C++问题:default parameter and overriding/inheritanc (转载)请教 C++的一个困惑 (operator delete)
go的抽象能力确实比较差A C++ inheritance question!
c++里的函数可不可以是virtual+staticC++小插曲
effective C++里的memory pool 一问:[合集] 一道C++面试题 (转载)
问个 C++到C的问题[合集] C++ virtual function的一个问题。。
相关话题的讨论汇总
话题: do话题: void话题: virtual话题: private话题: run