У меня есть код следующего стиля:
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 должен быть класс / структура / объединение.
Какова правильная структура для того, что я хочу сделать?
Вы не можете сделать это. Вы должны (по крайней мере) объявить метод в базовом классе. Например:
#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()
,
Во-первых, вы должны понимать, что призвание 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();
}