假设我想用不同的指针类型在我的类之外重载一个函数。我可以在 C++11 中执行此操作吗?
struct Bird;
struct Bear;
struct Animal {
virtual Bird* AsBird() = 0;
virtual Bear* AsBear() = 0;
};
struct Bird : public Animal{
virtual Bird* AsBird(){ return this; }
virtual Bear* AsBear(){ return NULL; }
};
struct Bear : public Animal{
virtual Bird* AsBird(){ return NULL; }
virtual Bear* AsBear(){ return this; }
};
void Print(Animal* a){
cout << "I don't know what animal this is!" << endl;
}
void Print(Bear* b){
cout << "That's a bear!" << endl;
}
void Print(Bird* b){
cout << "That's a bird!" << endl;
}
int main(int argc, char* argv[]){
Animal* a = new Bear;
Bear* bear;
Bird* bird;
if (bear = a->AsBear()){
Print(bear);
} else if (bird = a->AsBird()){
Print(bird);
}
return 0;
}
此代码有效,但绝对糟糕。我试过使用模板和自动,但编译器不想与我的邪恶实验有任何关系。有这样做的合法方法吗?
最佳答案
您所做的是重载 Print
通过更改其参数类型的自由函数,不涉及继承,这是完全合法的。
但是您不需要它(或任何类似 dynamic_cast 的东西):您应该做的是添加一个 virtual void Print() const = 0
在你的Animal
而不是基类,并在每个派生类中覆盖它。
示例:
struct Animal {
virtual void Print() const = 0;
};
struct Bird : public Animal{
void Print() const { cout << "That's a bird!\n"; }
};
struct Bear : public Animal{
void Print() const { cout << "That's a bear!\n"; }
};
int main(){
Animal* a = new Bear;
a->Print();
Animal* b = new Bird;
b->Print();
}
关于c++ - 我可以在 C++11 的类外执行继承吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25399067/