2013-08-09 3 views
0

Учитывая следующий сценарий, у меня есть базовый класс MyBaseClass с чистой виртуальной функцией void foo() = 0;. Два класса MyClassA и MyClassB получены из этого класса MyBaseClass. Оба реализуют функцию foo(). Теперь в проекте, над которым я работаю, я наткнулся на объект, созданный из класса MyBaseClass, на который вызывается функция foo(). Интересно, что это реализация от MyClassB, которая используется. Где определено, что именно эта реализация, а не один из MyClassAРеализация чистой виртуальной функции в C++

+0

Если 'MyBaseClass' имеет чистую виртуальную функцию, как ее можно создать? – HAL

ответ

3

я наткнулся на объект, созданный из класса MyBaseClass

Нет, ты не сделал. Объекты типа MyBaseClass не могут существовать. Класс абстрактен и не может быть создан.

Возможно, вы указали указатель на MyBaseClass, который может указывать на любые объекты классов, наследующие базовый класс.

Есть ли способ вызова реализации MyClassA, хотя pA указывает на объект класса MyClassB? Может быть, с актерским составом?

Вы можете позвонить

pA->MyBaseClass::foo(); 

, но это будет работать только тогда, когда функция реализована. (да, вы можете обеспечить реализацию для чистого метода)

+0

Спасибо, это действительно указатель, а не объект базового класса! Есть ли способ вызвать реализацию 'MyClassA', хотя' pA' указывает на объект класса 'MyClassB'? Может быть, с актерским составом? – tzippy

+0

@tzippy смотреть редактирование. –

4

Объект был типа MyClassB не MyBaseClass. MyBaseClass является абстрактным и не может быть создан. Однако у вас, вероятно, был указатель MyBaseClass*, который указывал на экземпляр MyClassB.

Возможно, вам стоит прочитать о наследовании и полиморфизме на C++, если вам нужна дополнительная информация.

MyBaseClass base; // Compiler error, cannot instantiate abstract class 
MyClassA a; 
MyClassB b; 

MyBaseClass* pA = &a; 
MyBaseClass* pB = &b; 

pA->foo(); // Uses implementation of foo in MyClassA 
pB->foo(); // Uses implementation of foo in MyClassB 
+0

Вы были правы. Это был указатель 'MyBaseClass', я благодарю вас за указание на это. – tzippy

+0

Есть ли способ вызова реализации MyClassA, хотя 'pA' указывает на объект класса' MyClassB'? Может быть, с актерским составом? – tzippy

+0

Нет, это не безопасно.'MyClassA' и' MyClassB' - разные типы. Если вы пытаетесь использовать общие методы между двумя классами, вы можете реализовать его в базовом классе. – dunc123

1

Важно заметить разницу между этими отрывками:

struct X 
{ 
    virtual void foo() = 0; 
}; 

X x; // not valid! X has purely virtual methods 

и

struct X; // as above 
struct Y : X 
{ 
    void foo() {} 
    void bar() {} 
}; 

X * x = new Y; // valid! 

Второй случай, наиболее вероятно, что вы уже видели. В этом шаблоне вы можете позвонить x->foo();, и он позвонит Y::foo(). Обратите внимание, что вы не можете, однако, позвонить x->bar(), потому что X::bar() не существует.

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