2013-03-26 5 views
-4

Пожалуйста, помогите мне. Я действительно плохо разбираюсь в полиморфизме. У меня есть классы, унаследованные один от другого.Вызов дочерней виртуальной функции от родителя

EDIT: Извините, полностью моя ошибка. Даже я прошел около 2 часов, чтобы найти проблему. Те, кому это интересно (спасибо за помощь)

if (type.compare("TEST1") == 0) result = new Test(ID, database); 
if (type.compare("TEST2") == 0) result = new Test(ID, database); 
if (type.compare("TOR") == 0) result = new Tor(ID, database); 

«== 0» полностью отсутствует.

class A { 
public: 
    void go() {do();} 
    virtual void do() {printf('A');} 
} 

class B:public A { 
    virtual void do() {printf('B');} 
} 

int main { 
    A* obj = new B(); 
    obj->go(); 
} 

Результат: «A» не «B». Как я могу сделать это «B»?

Спасибо.

+1

** Это не ваш настоящий код **. И результат ** - 'B' **, если вы исправляете опечатки, чтобы компилировать код. –

+1

Так много ошибок, делает OP кажутся ленивыми. – DanielKO

+0

Нет, это не так, как было бы долго. Я просто получил проблему, которую мне нужно решить. Благодарю. – Teddy

ответ

-1

После того как я убирала некоторые вещи, чтобы получить его скомпилировать:

#include <stdio.h> 

class A { 
public: 
    virtual void DO() {printf("A");} 
    void go() {DO();} 
}; 

class B:public A { 
    virtual void DO() {printf("B");} 
}; 

int main() { 
    A* obj = new B(); 
    obj->go(); 
    return 0; 
} 

(do это ключевое слово, printf принимает символ * не символ, main потребности скобки, и возвращает целое число)

Он всегда производил B для меня, независимо от уровня оптимизации я установил:

$ g++ inherit.cpp -o inherit && ./inherit 
B 
$ g++ inherit.cpp -O1 -o inherit && ./inherit 
B 
$ g++ inherit.cpp -O2 -o inherit && ./inherit 
B 
$ g++ inherit.cpp -O3 -o inherit && ./inherit 
B 
$ g++ inherit.cpp -O4 -o inherit && ./inherit 
B 
$ g++ inherit.cpp -O5 -o inherit && ./inherit 
B 

Однако, возможно, вы попали в кейс в своем компиляторе, который решил включить ваш звонок в do() внутри go().

+0

Спасибо. Извините за ошибки, но мне пришлось быстро выводить мой код, и я действительно злюсь на проблему, поскольку ожидаемое поведение отличается. Ваш код делает то, что мне нужно. На деле я должен был попробовать себя. Однако я не вижу «очевидной» разницы между вашим кодом и моим производственным кодом. Только один вопрос: не имеет значения, разделите ли файлы .h и .cpp друг с другом? – Teddy

+0

В C++ есть правило, специально для 'main', которое не дает оператора возврата. Законно не иметь оператора 'return' и' return 0; 'будет принято. –

+0

Я не думаю, что для компилятора действительно подходит для вызова виртуальной функции-члена следующим образом: http://www.parashift.com/c++-faq/inline-virtuals.html –

5

код не компилируется как есть, но после нескольких изменений, мне кажется, чтобы получить желаемые результаты:

#include <cstdio> 

class A { 
public: 
    void go() 
    { 
     do1(); 
     }; 
    virtual void do1() {printf("a");} 
}; 

class B:public A { 
    virtual void do1() {printf("b");} 
}; 

int main() { 
    A* obj = new B; 
    obj->go(); 
} 

Прежде всего do является reserved word, main был должным образом не объявлен и printf принимает char *:

int printf(const char *format, ...); 

так что вы пытались сделать недопустимое преобразование из char в char *.

+3

[live demo] (http://ideone.com/zsZXPI) для всех, кто может усомниться. –

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