класс — вызов метода подкласса C ++ из суперкласса

У меня есть код следующего стиля:

class SubClass;
class SuperClass;

class SuperClass {

private:

void bar() {

SubClass().foo();
}
};

class SubClass : SuperClass {

public:

void foo() {};
};

Так что в основном у меня есть суперкласс, откуда я хочу вызвать метод foo () подкласса.
VS 2012 дает мне следующие ошибки:

Ошибка 1 ошибка C2514: «SubClass»: класс не имеет конструкторов.

Ошибка 2 ошибка C2228: слева от .foo должен быть класс / структура / объединение.

Какова правильная структура для того, что я хочу сделать?

3

Решение

Вы не можете сделать это. Вы должны (по крайней мере) объявить метод в базовом классе. Например:

#include <iostream>

class SuperClass
{
public:
void bar()
{
foo();
}
private:
virtual void foo() // could be pure virtual, if you like
{
std::cout << "SuperClass::foo()" << std::endl;
}
};

class SubClass : public SuperClass // do not forget to inherit public
{
public:
virtual void foo() { std::cout << "SubClass::foo()" << std::endl; }
};

int main()
{
SuperClass* pTest = new SubClass;

pTest -> bar();

delete pTest;
}

распечатает SubClass::foo(),

8

Другие решения

Во-первых, вы должны понимать, что призвание SubClass().foo() не имеет ничего общего с текущим объектом — он создаст новый SubClass возразить и назвать его foo член. Если вы хотите bar функция для вызова foo на текущий объект, вам нужно объявить foo как виртуальная функция в базовом классе, как предложил Кирил.

Однако, если вы хотите позвонить foo на новом объекте (который не имеет особого смысла, но все равно), вы делаете это правильно. Ваш пример не скомпилирован, потому что SubClass заранее объявлено, но не определено ранее bar функция — вы можете переместить реализацию bar ниже определения SubClass, вот так:
класс SubClass;
класс SuperClass;

class SuperClass {

private:

void bar();
};

class SubClass : SuperClass {

public:

void foo() {};
};

void SuperClass::bar() {
SubClass().foo();
}
0

По вопросам рекламы [email protected]