c**a 发帖数: 316 | 1 想不通这个问题, 请指教一下。
如果要访问protected data当然 只能用 private inheritance 不能composition
这个好理解。
但是书上还这么说
if derived class wanna redefine virtual function,
we should we private inheritance.
我觉得不是啊.要redefine virtual function, 咋用都可以。
class Base
{
public:
virtual void f(){std::cout << "Base"; };
};
class DerivedPrivate:private Base
{
public:
virtual void f(){std::cout << "Derived via inheritance"; Base::f();};
};
class DerivedComposite
{
public:
virtual void f(){std::cout << "composite"; b.f();};
private:
Base b |
l********g 发帖数: 134 | 2 I guess the point of private inheritance is, in your case, class
DerivedPrivate can override virtual functions of class base, while class
DerivedComposite can not.
【在 c**a 的大作中提到】 : 想不通这个问题, 请指教一下。 : 如果要访问protected data当然 只能用 private inheritance 不能composition : 这个好理解。 : 但是书上还这么说 : if derived class wanna redefine virtual function, : we should we private inheritance. : 我觉得不是啊.要redefine virtual function, 咋用都可以。 : class Base : { : public:
|
c**a 发帖数: 316 | 3 But since Derived classes can no longer act as Base,
why we shall override Base virtual func.
We can simply redelare and redefine new virtual func. in Derived.
【在 l********g 的大作中提到】 : I guess the point of private inheritance is, in your case, class : DerivedPrivate can override virtual functions of class base, while class : DerivedComposite can not.
|
l********g 发帖数: 134 | 4 again, class Base and class DerivedPrivate support dynamic binding, while
class DerivedComposite cannot.
【在 c**a 的大作中提到】 : But since Derived classes can no longer act as Base, : why we shall override Base virtual func. : We can simply redelare and redefine new virtual func. in Derived.
|
t****u 发帖数: 8614 | 5 基本原则是能用composition就用composition,除非composition不能work只能使用
private inheritance才用inheritance。
【在 c**a 的大作中提到】 : 想不通这个问题, 请指教一下。 : 如果要访问protected data当然 只能用 private inheritance 不能composition : 这个好理解。 : 但是书上还这么说 : if derived class wanna redefine virtual function, : we should we private inheritance. : 我觉得不是啊.要redefine virtual function, 咋用都可以。 : class Base : { : public:
|
S*********g 发帖数: 5298 | 6 effective C++的item 42:
Use private inheritance judiciously
【在 t****u 的大作中提到】 : 基本原则是能用composition就用composition,除非composition不能work只能使用 : private inheritance才用inheritance。
|
c**a 发帖数: 316 | 7 。。。
就是看了上面的书才有这个问题。
Scott 说 用 private 主要有两个原因, protected data 不必说。
Redefine virtual func 这点不理解。
【在 S*********g 的大作中提到】 : effective C++的item 42: : Use private inheritance judiciously
|
c**a 发帖数: 316 | 8 ...
不知道你在说什么, 但是貌似无关。
again, class Base and class DerivedPrivate support dynamic binding, while
class DerivedComposite cannot.
【在 l********g 的大作中提到】 : again, class Base and class DerivedPrivate support dynamic binding, while : class DerivedComposite cannot.
|
l********g 发帖数: 134 | 9 then forget it.
【在 c**a 的大作中提到】 : ... : 不知道你在说什么, 但是貌似无关。 : : again, class Base and class DerivedPrivate support dynamic binding, while : class DerivedComposite cannot.
|
S*********g 发帖数: 5298 | 10 再往下看Item 43,仔细看那个MyPerson和PersonInfo的例子
【在 c**a 的大作中提到】 : 。。。 : 就是看了上面的书才有这个问题。 : Scott 说 用 private 主要有两个原因, protected data 不必说。 : Redefine virtual func 这点不理解。
|
|
|
c**a 发帖数: 316 | 11 书都看完了。 还是不懂。。。
他后来用WidgetTimer 去包Timer 我觉得没必要嘛, 直接composite 就好了。
完了,我们说的不是一个版本的书。。。
【在 S*********g 的大作中提到】 : 再往下看Item 43,仔细看那个MyPerson和PersonInfo的例子
|
c**a 发帖数: 316 | 12 。。。
因为是 private inheritance 了, 所以 Derived 不能act as base
所以和dynamic binding 没什么关系。
then forget it.
【在 l********g 的大作中提到】 : then forget it.
|
S*********g 发帖数: 5298 | 13 我把相关的那段贴上来吧
For example, Item 34 describes how a Protocol class exists only to specify
an interface for derived classes; it has no data members, no constructors, a
virtual destructor (see Item 14), and a set of pure virtual functions that
specify the interface. A Protocol Person class might look like this:
class Person {
public:
virtual ~Person();
virtual string name() const = 0;
virtual string birthDate() const = 0;
virtual string address() const = 0;
virtual string nationality() cons |
c**a 发帖数: 316 | 14 明白了。
谢谢。
其实新版的也有这段, 只是不同地方而已。
我得多看几遍书了。
a
that
【在 S*********g 的大作中提到】 : 我把相关的那段贴上来吧 : For example, Item 34 describes how a Protocol class exists only to specify : an interface for derived classes; it has no data members, no constructors, a : virtual destructor (see Item 14), and a set of pure virtual functions that : specify the interface. A Protocol Person class might look like this: : class Person { : public: : virtual ~Person(); : virtual string name() const = 0; : virtual string birthDate() const = 0;
|
S*********g 发帖数: 5298 | 15 我的版本里也不是在另外一个item里的,在item 43里
【在 c**a 的大作中提到】 : 明白了。 : 谢谢。 : 其实新版的也有这段, 只是不同地方而已。 : 我得多看几遍书了。 : : a : that
|
c**a 发帖数: 316 | 16 我错在 总是误以为 virutal 就一定在 public interface 里面。
【在 S*********g 的大作中提到】 : 我的版本里也不是在另外一个item里的,在item 43里
|