首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有多态基和继承类实例化的C++问题

带有多态基和继承类实例化的C++问题
EN

Stack Overflow用户
提问于 2014-06-22 07:47:03
回答 1查看 1.2K关注 0票数 2

我有一个基本基类和几个继承自它的子类。

代码语言:javascript
复制
Class Base{
public:
   Base(){};
   virtual ~Base();
   virtual void foomethod()=0; //Marked as pure virtual
};

Class A : public Base{
   A(){};  //Ctor
   ~A(){}; //Dtor
   void foomethod(){ /* DO SOMETHING */ }
}
Class B : public Base{
   B(){};  //Ctor
   ~B(){}; //Dtor
   void foomethod(){ /* DO SOMETHING */ }
}

以上使用将引发以下使用中的错误:

代码语言:javascript
复制
Base a = A();
Base b = B();

编译器抱怨foomethod()函数是纯虚拟的。

但是,当使用以下内容时,没有问题。

代码语言:javascript
复制
A a = A();
B b = B();

我认为,由于C++的多态原则,第一个实例应该被接受。我希望在子类中强制执行该方法的特定方法实现。如果它仅被标记为虚拟,则不能保证它将被显式覆盖。

EN

回答 1

Stack Overflow用户

发布于 2014-06-22 07:56:05

在您的代码中有几个问题,我将尝试获得其中的大部分:

  1. 如果不将纯函数标记为虚拟的,就不能拥有纯函数。
  2. 不能创建抽象Base类的对象(方法没有代码)
  3. 当你写 基b= A(); 您正在创建两个对象,然后将A对象分配给Base b对象。这是不可能的,因为Base是抽象的,但是在可能发生这种情况的情况下,您可以体验slicing problem
  4. 在派生类中将析构函数标记为虚拟,但在Base中没有标记(也没有定义),在使用虚拟多态性时始终将其标记为virtual,否则派生析构函数将不会被调用。

这是一种更正确的做法:

代码语言:javascript
复制
#include <iostream>
using namespace std;

class Base{
public:
   Base(){};
   virtual ~Base() {};
   virtual void foomethod()=0; //Marked as pure virtual
};

class A : public Base{
public: 
   A(){};  //Ctor
   virtual ~A(){}; //Dtor
   void foomethod(){ cout << "Hello from A"; }
};
class B : public Base{
public:
   B(){};  //Ctor
   virtual ~B(){}; //Dtor
   void foomethod(){ /* DO SOMETHING */ }
};

int main() {

    // Base obj; // Can't do that
    Base *obj = new A();
    obj->foomethod(); // A's one
    delete obj;

    return 0;
}

http://ideone.com/gvcL9S

哦,还有一些语法错误。还有一个可见性问题,如果你打算从外部使用这些函数..。但我相信摘录只是个伪代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24349183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档