C ++问题与多态基和继承类实例化

时间:2014-06-22 07:47:03

标签: c++ polymorphism virtual

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

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 */ }
}

使用上述内容会导致以下用法出错:

Base a = A();
Base b = B();

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

但是,如果使用以下内容,则没有问题。

A a = A();
B b = B();

我原本认为,由于C ++的多态原理,第一个实例应该被接受。我想在子类中强制执行该方法的特定方法。如果它被标记为仅虚拟,则无法保证它将被明确覆盖。

1 个答案:

答案 0 :(得分:3)

您的代码存在多个问题,我会尝试获取大部分内容:

  1. 如果没有将其标记为虚拟

  2. ,则无法使用纯函数
  3. 您无法创建抽象Base类的对象(方法没有代码)

  4. 写作时

    Base b = A();
    

    您正在创建两个对象,然后将A对象分配给Base b对象。这是不可能发生的,因为Base是抽象的,但如果发生这种情况,您可以体验slicing problem

  5. 您在派生类中将析构函数标记为虚拟,但未在Base中标记(也没有定义),在使用虚拟多态时始终将其标记为virtual,否则派生的析构函数将不会被称为

  6. 这是一种更正确的方法:

    #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

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