2017-01-09 46 views
-1

我看到这个例子初始化的对象: http://www.cplusplus.com/doc/tutorial/typecasting/#dynamic_cast用不同类

(...) 
class Base { virtual void dummy() {} }; 
class Derived: public Base { int a; }; 
(...) 
Base * pba = new Derived; 
Base * pbb = new Base; 
(...) 

为什么“PBA”为基本对象,如果它正在与衍生初始化?为什么不把它作为派生对象?

Derived * pba = new Derived; // use this instead 

而且它只是一个C++的东西吗?

+2

这是*多态*的一个实例。你不能指望我们提供一个完全详细的答案,因为这是一个相当广泛的主题(我相信这里有一些重复)。 – Downvoter

+0

这是dynamic_cast的一个例子。如果你写 _derived * PBA =新的派生; _ 那么这行没有任何意义 _pd = dynamic_cast的(PBA); _ –

+1

如果你同时拥有[一组猫,狗](HTTPS://en.wikipedia .org/wiki/Polymorphism_%28computer_science%29%23Subtyping),并且想让这个集合中的所有动物发出声音,然后你为每个动物调用'Animal :: talk()',但这个调用会产生不同的结果,关于动物的实际分类。 – Dialecticus

回答

1

既不pba也不pbb是一个对象,但它们是类型基类Base的指针,以便在您的代码使用他指针多态,这意味着一个基指针可以指向相同的类或它的派生类对象。

  • 该目的是利用新的未PBB创建或PBA本身,可以考虑下面的例子:

    #include <string> 
    #include <iostream> 
    using namespace std; 
    
    
    class Base 
    { 
        public: 
         virtual void Print() const { cout << "Base print()" << endl;} // virtual function 
         void Greet()const {cout << "in Base Say: hello!" << endl;} 
    }; 
    
    class Derived : public Base 
    { 
        public: 
         void Print() const { cout << "Derived print()" << endl;} // ovrode the base member pritn() 
         void Greet()const {cout << "in Derived Say: hello!" << endl;} 
    }; 
    
    int main() 
    { 
    
        Base* pba = new Derived; 
    
        pba->Print(); // Derived print() 
        pba->Greet(); // in Base Say: hello! ??? because Greet() is not virtual 
    
        Base* pbb = new Base; 
    
        pbb->Print(); // Base print() 
        pbb->Greet(); // in Base Say: hello! 
    
        return 0; 
    } 
    

    所以在运行时指针PBA和PBB可以由此所分配的基础的目的或派生的类虚拟成员函数被相应地调用。