2010-03-12 96 views
24
class Base 
{ 
    public: 
    int base_int; 
}; 

class Derived : public Base 
{ 
    public: 
    int derived_int; 
}; 

Base* basepointer = new Derived(); 
basepointer-> //Access derived_int here, is it possible? If so, then how? 
+3

你真的想要使用私有继承吗? – 2010-03-12 21:53:23

+1

有人给它添加一个语句终止符,我只改变一个字符。 – 2011-04-16 13:25:48

回答

38

任何成员,则无法访问derived_int因为derived_intDerived一部分,而basepointer是指向Base

你可以做,虽然它倒过来:

Derived* derivedpointer = new Derived; 
derivedpointer->base_int; // You can access this just fine 

派生类继承基类,而不是周围的其他方式的成员。

Base* basepointer = new Derived; 
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer 

请注意,您需要将自己的遗产改变为public第一:

class Derived : public Base 

但是,如果你的basepointer指着的Derived一个实例,那么你可以通过投访问

+1

不应该使用dynamic_cast而不是static_cast? – 2010-03-12 22:09:05

+9

这取决于他是否知道它是否是“派生的”。如果你100%确定(因为我们在这里),那么'static_cast'很好。 – 2010-03-12 22:14:18

+0

并不是每个人都意味着reinterpret_cast而不是static_cast?我很确定static_cast不会编译。 – Balk 2012-03-16 14:42:45

9

你在这里的雷区上跳舞。基类永远不会知道它实际上是派生的实例。要做到这一点,最安全的方法是在基础引入虚函数:

class Base 
{ 
protected: 
virtual int &GetInt() 
{ 
    //Die horribly 
} 

public: 
int base_int; 
}; 

class Derived : Base 
{ 
    int &GetInt() 
    { 
    return derived_int; 
    } 
public: 
int derived_int 
}; 

basepointer->GetInt() = 0; 

如果basepointer点,其他的是一个派生出来的,你的程序将死可怕,这是预期的结果。

或者,您可以使用dynamic_cast(basepointer)。但是你至少需要一个基本的虚拟功能,并且准备遇到一个零。

static_cast <>正如一些人所暗示的那样,这是一种在脚下自我射击的好方法。不要为“C语言家族的不安全”恐怖故事大量缓存作出贡献。

+0

“或者,你可以使用dynamic_cast的(basepointer),但至少需要一个虚函数的基础是什么,以及准备遇到一个零。” - >好点Seva.Liked它:) – mahesh 2010-04-16 08:58:20

+3

使用'static_cast'是不拍自己的脚的方式。我认为你用C的明确演员记法'(T)x'来混淆它。另一方面'static_cast'是类型安全的,但'dynamic_cast'将返回一个空指针,如果它无法转换,而'static_cast'将发出编译器错误。 – 0x499602D2 2015-06-07 21:06:00

4

可以使用CRTP

你基本上使用的派生类中的模板基类

3

它是通过让基类可能知道派生类的类型。这可以通过将基类作为派生类型的模板来完成。这个C++习惯用语叫做curiously recurring template pattern

了解派生类,基类指针可以静态转换为派生类型的指针。

template<typename DerivedT> 
class Base 
{ 
public: 
    int accessDerivedField() 
    { 
     auto derived = static_cast<DerivedT*>(this); 
     return derived->field; 
    } 
}; 


class Derived : public Base<Derived> 
{ 
public: 
    int field; 
}; 

int main() 
{ 
    auto obj = new Derived; 
    obj->accessDerivedField(); 
} 
0

//如果你知道你要使用什么样的派生类

派生* derivedpointer = dynamic_cast的<派生*> basepointer;

//然后你可以使用派生指针访问派生类