2015-02-28 6 views
0

Это мой базовый классC++ создать полезный метод в дочернем классе

class Base { 
protected: 
    int number; 
public: 
    Base(int num); 
    virtual void display() = 0; 
}; 

эти два класса унаследовали базы.

class Derived: public Base { 
public: 
    Derived(int num); 
    void display(){cout <<"hello";} 
    void other(); 
}; 

class Derived2: public Base { 
public: 
    Derived(int num); 
    void display(){cout <<"hello other";} 
}; 

этот класс позволяет мне просто инстанцирует мои два класса Derived и Derived2

class Foo{ 
private: 
    Base * toto[2]; 
public: 
    Foo(){ 
    toto[0] = new Derived; 
    toto[1] = new Derived2; 
    } 

    void doSomething(); 
} 

, и я хочу сделать это

void Foo::doSomething(){ 
    toto[0]->other(); 
} 

$$$$$$$$$$ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$

последнего вопроса я создаю новый класс унаследовал Derived2 и Base

class Derived3: public Derived2, public Base { 
public: 
    Derived(int num); 
    void display(){cout <<"hello";} 
    void other(); 
}; 

теперь я хочу, чтобы это сделать

toto[0] = new Derived3 

This my error message 

неоднозначного преобразование из производного класса Derived3 'до базового класса «Base»: класса Derived3 -> класс База класс Derived3 -> класс Derived2 -> класс Base

Назначение «Base» из несовместимого типа «Derived3 *»

+1

Возникли вопросы здесь? – Brian

+0

Я хочу назвать свой метод другим в классе Derived – Darkness007

ответ

2

If toto[0] всегда будет указывать на Derived и toto[1] всегда будет указывать на Derived2, вероятно, вы должны сделать это:

class Foo{ 
private: 
    Derived d1; 
    Derived2 d2; 
    Base * toto[2]; 
public: 
    Foo(){ 
     toto[0] = &d1; 
     toto[1] = &d2; 
    } 

    void doSomething() { 
     d1.other(); 
    } 
}; 

Если у вас действительно есть bona fide необходимо создать ситуацию, когда типизация не может быть проверена статически, а затем используйте dynamic_cast. Но старайтесь избегать этого, если это возможно. Не рассматривайте C++ как динамически типизированный язык.

Derived* dptr = dynamic_cast<Derived*>(toto[0]); 
if (dptr) { 
    dptr->other(); 
} else { 
    throw std::logic_error("toto[0] should point to Derived"); 
} 
+0

@ Darkness007 'Derived3' содержит две копии' Base', поэтому он неоднозначен: один, потому что вы получили от 'Base' напрямую и один, потому что вы получили из' Derived2', который содержит 'Base'. Вероятно, вы не хотите, чтобы 'Derived3' наследовался напрямую из' Base'. Кроме того, в будущем, пожалуйста, разместите новый вопрос, а не добавьте больше вопросов к существующему вопросу. – Brian

2

Вы можете использовать Dinamic ролях: http://en.cppreference.com/w/cpp/language/dynamic_cast

void Foo::doSomething(){ 
    Derived* e = dynamic_cast<Derived*>(toto[0]); 

    if (e != nullptr) //Did cast work? 
     e->other(); 
} 
+0

Было бы неплохо проверить, что литье выполнено, т. Е. Что 'e' не' nullptr' ПЕРЕД вызовом 'e-> other()' – Christophe

+0

@Christophe Edited. Спасибо Christophe – amchacon

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