2011-12-15 6 views
0

У меня возникла странная проблема, и я уверен, что ее легко исправить. У меня супер класс, назовем его «Птица». Птица имеет виртуальную функцию под названием chirp, которая возвращает мне 0. У меня также есть подкласс, который позволяет называть его ... SomeOtherBird. SomeOtherBird - подкласс Птицы. Функция ЛЧМ() для моего подкласса должен вернуть мне 1.Полиморфизм C++

До сих пор:

Bird.Chirp() должна возвращать 0 SomeOtherBird.Chirp() должен возвращать 1

Некоторые другие птицы является подклассом птицы.

Теперь, предполагая, что я перехожу в Bird в отдельный конструктор, назовем его гнездом.

Итак: гнездо (Bird & х)

, если я прохожу SomeOtherBird, и я называю Chirp, она вызывает виртуальную функцию главного супер-класса, а не подкласса, так, например:

SomeOtherBird x; Гнездо (x); , а затем, если я делаю x.chirp, вызывается основной метод, а не один из подкласса.

Как получить функцию в вызываемом подклассе, а не виртуальную главную функцию?

Благодаря

+3

Кроме того, включают в себя фактический код у вас возникли проблемы с, а не какой-то описание окольным. – Xeo

+0

Dynamic Dispatch должен работать, и он должен возвращать 1, если вы не делаете что-то еще. Опубликовать весь код – Anand

ответ

-1

Не видя кода это невозможно ответить вам точно. Однако это звучит так, будто вы не пишете «virtual Bird()» в базовом классе, только в производном классе. Это не работает.

class Bird { 
virtual int Bird(); 
}; 

class MoreBird : public Bird { 
int Bird(); 
}; 

Виртуальное ключевое слово не требуется в классе, производный (хотя это не является хорошей практикой, чтобы не поставить его там, даже если 99,9% программистов ленивы и не делать это.)

+3

Возможно, вы захотите снова замаскировать свой код, 'Bird()' является конструктором. – Xeo

+0

т. Е. У вас не может быть виртуального конструктора. –

+0

Хорошо 8-) Я вижу, что в любом случае другие придерживались правильного кода. –

1

Я работал на меня.

ideone.com/RRfau

Вы действительно должны включать некоторые примеры кода с вопросами, как это так, мы можем помочь вам.

#include <iostream> 
#include <typeinfo> 

class Bird 
{ 
public: 
    virtual ~Bird() {} 
    virtual int chirp() { return 0; } 
}; 

class SomeOtherBird : public Bird 
{ 
public: 
    virtual int chirp() { return 1; } 
}; 

void nest(Bird& x) 
{ 
    std::cout << typeid(x).name() << " says " << x.chirp() << '\n'; 
} 

int main() 
{ 
    SomeOtherBird s; 
    nest(s); 

    Bird b; 
    nest(b); 
} 
1

Работы нормально, как показано ниже. Возможно, вы, возможно, не сделали базовый метод виртуальным. Или в коде что-то еще не так, так как код не был отправлен, невозможно сказать.

#include <iostream> 
using namespace std; 

class Bird 
{ 
public: 
    Bird() {} 
    ~Bird() {} 
    virtual int Chrip() { cout << "Bird version" << endl; return 0; } 
}; 

class SomeOtherBird:public Bird 
{ 
public: 
    SomeOtherBird() {} 
    ~SomeOtherBird() {} 
    virtual int Chrip() { cout << "SomeOtherBird version" << endl; return 1; } 
}; 

int nest(Bird &b) 
{ 
    b.Chrip(); 
} 

int main() 
{ 
    SomeOtherBird s; 
    Bird &b = s; 
    int retcode = nest(b); 
    cout << "retcode " << retcode << endl; 
} 

Выход:

rhdevblade1-~/cpp: ./virt 
SomeOtherBird version 
retcode 1 
Смежные вопросы