2017-01-09 11 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; 
(...) 

Почему «РОВ» является базовым объектом, если он инициализируется с Derived? Почему бы не сделать его производным?

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

И это всего лишь вещь C++?

+2

Это экземпляр * полиморфизма *. Вы не можете ожидать, что мы предоставим вам исчерпывающий ответ, так как это довольно широкий вопрос (и я уверен, что здесь есть несколько дубликатов). – Downvoter

+0

И это пример для dynamic_cast. Если вы пишете _Derived * pba = new Derived; _ , тогда эта строка не имеет смысла _pd = dynamic_cast (pba); _ –

+1

Если у вас есть [кошки и собаки в наборе] (https: //en.wikipedia .org/wiki/Polymorphism_% 28computer_science% 29% 23Subtyping), и хотите, чтобы все животные в этом наборе произносили звук, вы вызываете «Animal :: talk()» для каждого животного, но этот вызов даст разные результаты, основанные на на фактический класс животного. – Dialecticus

ответ

1

ни pba, ни pbb является объектом, но они являются указателями типа базового класса Base так в коде, который вы использовали его указатели полиморфно, который означает, что базовый указатель может указывать на тот же класс или его производный объект класса.

  • объект создается с новым не ПБВ или 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; 
    } 
    

    так во время выполнения указатель РВА и ПБД может быть присвоен объект базы или производный классы, таким образом, вызываются соответственно.

Смежные вопросы