Я написал следующий код, который собирался запустить, чтобы помочь мне просмотреть наследование и то, как диспетчеризация/двойная диспетчеризация работает в C++, но он не скомпилируется. Я просмотрел прототипы/предварительные объявления классов и сделал это, но все еще получаю сообщение об ошибке «B — неполный тип», «SubB — неполный тип» и т. д. В чем проблема?
#include <iostream>
class B;
class SubB;
class A {
public:
void talkTo(B b){
std::cout << "A talking to instance of B" << std::endl;
}
void talkTo(SubB sb){
std::cout << "A talking to instance of SubB" << std::endl;
}
};
class SubA : A {
public:
void talkTo(B b){
std::cout << "SubA talking to instance of B" << std::endl;
}
void talkTo(SubB sb){
std::cout << "SubA talking to instance of SubB" << std::endl;
}
};
class B {
public:
void talkTo(A a){
std::cout << "B talking to instance of A" << std::endl;
}
void talkTo(SubA sa){
std::cout << "B talking to instance of SubA" << std::endl;
}
};
class SubB : B {
public:
void talkTo(A a){
std::cout << "SubB talking to instance of A" << std::endl;
}
void talkTo(SubA sa){
std::cout << "SubB talking to instance of SubA" << std::endl;
}
};
РЕДАКТИРОВАТЬ
Изменение параметров на ссылки сделало эту работу (помощь R Sahu), но почему это не работает сейчас?
class A {
public:
void talkTo(B &b){
//std::cout << "A talking to instance of B" << std::endl;
b.talkTo(this);
}
void talkTo(SubB &sb){
//std::cout << "A talking to instance of SubB" << std::endl;
sb.talkTo(this);
}
};
class B {
public:
void talkTo(A &a){
std::cout << "B talking to instance of A" << std::endl;
}
void talkTo(SubA &sa){
std::cout << "B talking to instance of SubA" << std::endl;
}
};
class SubB : B {
public:
void talkTo(A &a){
std::cout << "SubB talking to instance of A" << std::endl;
}
void talkTo(SubA &sa){
std::cout << "SubB talking to instance of SubA" << std::endl;
}
};
A a;
SubA subA;
B b;
SubB subB;
a.talkTo(b);
a.talkTo(subB);