如果我分配一个类Derived的对象(用碱类Base的),并存储一个指向在指向基类的一个变量,它的对象,我怎样才能访问Derived类的成员<? / p>

下面是一个例子:

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?
有帮助吗?

解决方案

没有,则不能因为derived_intderived_int的一部分访问Derived,而basepointerBase一个指针。

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

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

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

不过,如果你basepointer指着Derived的实例,那么你可以通过投访问:

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

请注意,你需要改变你的继承先public

class Derived : public Base

其他提示

您在这儿跳舞的雷区。该基类是不会知道它实际上是派生的一个实例。做到这一点的最安全的方法是在基体引入的虚拟功能:

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点作为其他东西,一个Derived,你的程序将可怕死,这是预期的结果。

可替换地,可以使用dynamic_cast<Derived>(basepointer)。但需要至少一个虚拟函数的Base为该,并准备遇到零。

static_cast<>,像一些建议,是一种肯定的方式来搬起石头砸自己的脚。不要造成的恐怖故事“C语言家族的不安全”的巨大的缓存。

可以使用 CRTP

在基本上使用派生类在模板的基础类

有通过使基类知道派生类的类型是可能的。这可以通过使基类派生类型的模板来完成。这个C ++成语称为奇异递归模板模式

知道了派生类,基础类指针可以是静态铸的指针派生类型。

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

//如果你知道派生类,你要使用

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

//然后可以访问导出使用derivedpointer类

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top