2014-01-29 2 views
-2

Это простой вопрос (я думаю). Я просто не уверен, что об этом и я ищу хорошее решение тоже :)C++: приоритет наследования

Скажем, у меня есть это:

class Base { 
    public: 
    virtual ~Base() {} 
    virtual Base& connect(Base &b) = 0; 
} 

class Derived: public Base { 
    public: 
    virtual ~Derived() {} 
    virtual Base& connect(Base &b) 
    { 
     // do_something 
    } 
} 

// Name is a class that is basically a String and assign it to any A or B object. 

class A: public Derived { 
    public: 
    A(name N) { ... } 
    virtual ~A() {} 
} 

class B: public Derived { 
    public: 
    B(name N) { ... } 
    virtual ~B() {} 
    A& connect(A &a) 
    { 
     // do something else 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    A objA("A"); 
    B objB("B"); 

    // Here's where is my issue 
    objB.connect(objA); 
} 

Когда я называю objB.connect(objA), это на самом деле вызова Base& connect(Base &b). Я понимаю, потому что оба являются дочерними из Base, и оба имеют connect(), определенные в Derived. Но дело в том, что я хотел бы, чтобы всякий раз, когда у меня есть objB.connect(objA), вместо этого он должен позвонить A& connect(A &a).

Я хотел бы знать, есть ли способ получить его так, как я хочу.

Спасибо :)

UPDATE

Я редактировал это, потому что у меня было несколько опечаток. Я не копировал-вставлял код, потому что он довольно сложный, чем я хочу. < Надеюсь, этого достаточно.

+3

Показать код, который компилируется. 'A objA = new A();' инициализирует объект с указателем. Ваша ошибка, вероятно, заключается в тонком неправильном использовании ссылок или бросков (или другой проблеме типа), поэтому нам нужен * точный * код для его воспроизведения. – Angew

+0

вы забыли 'virtual' в определении' connect (A & a) ' – Thomas

+0

Thsi не будет компилировать' A objA = new A() '. Все компиляторы, которые я использовал, отказываются компилировать эту строку. Как вы получили свою продукцию? – DumbCoder

ответ

2

Ваш код не компилируется. Вот код, который компилируется и результат, как вы хотите: вы можете выбрать, какую версию connect для вызова на основе типа указателя:

class Base { 
    public: 
    virtual ~Base() {} 
    virtual Base& connect(Base &b) = 0; 
}; 

class Derived: public Base { 
    public: 
    virtual ~Derived() {} 
    virtual Base& connect(Base &b) 
    { 
     qDebug() << "Baseconnect"; 
    } 
}; 

class AA: public Derived { 
    public: 
    AA() {} 
    virtual ~AA() {} 
}; 

class BB: public Derived { 
    public: 
    BB() {} 
    virtual ~BB() {} 
    AA& connect(AA &a) 
    { 
     qDebug() << "Aconnect"; 
    } 
}; 

пример:

int main(int argc, char *argv[]) 
{ 
    AA* aaptr = new AA; 
    BB* bbptr = new BB; 
    bbptr->connect(*aaptr); // version from BB is called 
    Derived* dptr = new BB; 
    dptr->connect(*aaptr); // version from Derived is called 
    // ... 
} 

В качестве примечания , всегда убедитесь, что ваши компиляции и вопрос правильно определены. В противном случае вы уменьшите шансы на полезный ответ на свой вопрос.

+0

Спасибо @ piotruś. Ваш ответ приблизил меня к решению моей проблемы. Это действительно помогло! – makeMonday

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