【问题标题】:C++ inheritance: defining a pointer to either derived or base classC++ 继承:定义指向派生类或基类的指针
【发布时间】:2014-02-20 05:00:41
【问题描述】:

如果我有一个基类的派生类,并且我想根据标志为它们中的任何一个对象分配一个指针,那么引用所选对象的指针的定义应该是什么。

例子:

void main(int argc, char* argv[])
{
   class Base B;
   class Derived D;
   class Base *P;  /* My question is output this definition */
   int flag;   /* This will be an input */
   if(flag)
      P = &B;   /* Should refer to the base class B */
   else
      P = &D;   /* Should refer to the derived class D
   /* Then I'd use P in the rest of my code */ 
} 

我的问题是如何将类指针 P 定义为能够基于标志 `flag' 引用 B(基类)或 D 派生类)?

【问题讨论】:

  • 只要Derived 派生自Base 就可以了。什么不适合你?
  • 谢谢jxh。我试图确定我的解决方案。我对定义部分感到困惑。可以将 P 定义为指向基类的指针,然后将其分配给派生类的指针吗?顺便说一句,其他方式是否也可以工作(即定义 P 如下:class Derived *P;)?
  • 不允许您进行该分配,因为B 不是Derived
  • 这个是可以的,但是指针只能用来调用B中声明的函数。如果你想调用D中不同的函数,那么你需要了解虚函数。
  • 除非您的代码跨越二进制边界并且需要不同版本的代码之间的兼容性,否则无需担心太多。您可以使用基类指针类型来引用您的基类和派生类。或者改为参考。 :)

标签: c++ class pointers inheritance


【解决方案1】:

假设您的代码是基本形式:

class Base
{
public:
   virtual ~Base() {}
};

class Derived : public Base
{};

那么根据语言规则,DerivedBase,因此指向基类的指针可以包含 DerivedBase

Base* p = nullptr;
Base b;
Derived d;

if(flag == UseBase)
{    
   // Works
   p = &b;
}
else if(flag == UseDerived)
{
   // also works
   p = &d;
}

也就是说,Base 不是Derived,因此反向 (Derived* pd = &b) 不会像上面写的那样工作。

【讨论】:

  • 谢谢乍得。我必须在基类中使用 virtual 吗?
  • 如果您打算使用动态内存分配 (new),并且将通过基类指针释放内存 (delete),那么是的,virtual 析构函数是必需的要保证的适当行为。
  • 理解虚方法非常重要。您可能希望您的方法是虚拟的。关于指针这件事,如果可能的话,引用甚至可以比指针更好。例如Base& myClassRef = (flag == kUseBaseClass ? b : d); 在 C++ 中,如果有令人信服的理由,你真的只想使用指针,比如 NULL 的值意味着什么。
  • 乍得:这种语法是否允许指针 p 调用派生类 d 中不是基类 b 成员的函数?
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多