2012-07-10 87 views
1

假设我有一个基本&派生类:C++ |重用基类的保护成员

class Base{ 
private: 
    int* _privateIntPtrB; 
protected: 
    int* _protectedIntPtrB; 
public: 
    //methods which use 
    //_privateIntPtrB and _protectedIntPtrB 

class Derived: public Base{ 
private: 
    int* _privateIntPtrD; 
protected: 
    int* _protectedIntPtrB; //I am redeclaring this var 
public: 
    //methods which use 
    //_privateIntPtrD and _protectedIntPtrB 

我的问题: 在Derived类的方法,并习惯的_protectedIntPtrB派生版本? (我认为它确实,但想确认)。

如果一个方法没有被Derived类重新定义,_protectedIntPtrB的哪个版本将被一个指向Derived类的指针使用?

我想问的原因 - 我想在Derived类中初始化_protectedIntPtrB类,并且希望_protectedIntPtrB的版本在Derived类的所有实例中使用。

+3

难道你不能只重用原来的一个,并在它的构造函数中给它赋一个不同的值吗? – Wug 2012-07-10 14:19:23

+1

我总是发现这类问题很难回答,尽管现在使用C++已经有十多年了。只是因为“正确”的答案是给那些试图这么做的人:“我不在乎如果你这样做会发生什么,*不这样做!* :-D(见Wug的评论。) – DevSolar 2012-07-10 14:20:17

+0

它将使用Derived类中的一个,但是如果您“希望在Derived类的所有实例中使用该版本的_protectedIntPtrB” - 是否指静态? – 2012-07-10 14:23:17

回答

5

在派生类的方法中,是否使用_protectedIntPtrB的派生版本?

是,它隐藏基类成员和因此在Derived的范围不合格使用_protectedIntPtrBDerived::_protectedIntPtrB。 (基类变量仍然可用,如果符合Base::_protectedIntPtrB的条件)。

如果一个方法没有被Derived类重新定义,哪个版本的_protectedIntPtrB将被指向Derived类的指针所使用?

基类变量。派生类的数据成员不能从基类中获得。

的原因,我问 - 我想初始化在派生类_protectedIntPtrB不同,想在派生类的所有实例中使用的_protectedIntPtrB的那个版本。

通常,使派生类的行为与其基类不同的最佳方式是覆盖虚函数。如果你真正想到你想要达到的目标,可能会更好:找出你想要修改的行为,并将其封装在一个虚拟函数中。

+0

感谢你重新执行第二点。 – armundle 2012-07-10 14:56:57