我是C ++的初学者,我想更改将在此代码中调用的函数版本:
#include <iostream>
class C1 {};
class C2 : public C1 {};
void func(C1 var) {
std::cout << "Func 1" << std::endl;
}
void func(C2 var) {
std::cout << "Func 2" << std::endl;
}
int main() {
C1 *teste1 = new C1;
C1 *teste2 = new C2;
func(*teste1); // Want "Func 1"
func(*teste2); // Want "Func 2"
return 0;
}
从注释中可以看到,我想要的是当我取消引用指向C2类的指针时调用带有C2参数的func。
编辑:只是为了阐明我真正想要实现的目标,以下代码更接近我想要的目标:
#include <iostream>
#include <list>
class C1 {};
class C2 : public C1 {};
void func(C1 var) {
std::cout << "Func 1" << std::endl;
}
void func(C2 var) {
std::cout << "Func 2" << std::endl;
}
int main() {
std::list<C1*> teste;
teste.push_back(new C1);
teste.push_back(new C2);
// Want to print:
// Func 1
// Func 2
for(auto i: teste) {
func(*i);
}
return 0;
}
答案 0 :(得分:3)
如果您知道要处理C2对象,则可以先强制转换为C2
指针:
func(*teste1); // Want "Func 1"
func(*static_cast<C2*>(teste2)); // Want "Func 2"
或者,您可以通过在C2
中使用虚函数来使C1
多态:
class C1 {
public:
virtual ~C1() {}
};
然后您可以执行dynamic_cast
:
func(*dynamic_cast<C2*>(teste2)); // Want "Func 2"
请注意,如果不确定自己拥有哪种对象,dynamic_cast
将在失败时返回空指针,因此可以执行以下操作:
if(dynamic_cast<C2*>(teste2)) {
func(*dynamic_cast<C2*>(teste2)); //If it's a C2, call the C2 overload
} else {
func(*teste2); //If it's a C1, call the C1 overload
}
甚至更好,如果可以避免的话,不要使用指针!
答案 1 :(得分:0)
如前所述,您可以将func()设为基础中的虚拟成员函数,然后将其覆盖。然后,调用YourObject.func()将返回您想要的内容。
虚拟函数具有vtable查找的开销,这在某些情况下会降低性能,但是如果在编译时知道实际上是什么类型,则可以使用CRTP进行“静态多态”。有很多关于此的文章,我建议您先走这条路,然后再学习模板-一定要先了解常规的虚函数。
答案 2 :(得分:0)
#include <iostream>
class C1 {
public:
virtual void func(){
std::cout << "Func 1" << std::endl;
}
};
class C2 : public C1{
public:
void func() override{
std::cout << "Func 2" << std::endl;
}
};
int main() {
C1* teste1 = new C1;
C1* teste2 = new C2;
teste1->func(); // Want "Func 1"
teste2->func(); // Want "Func 2"
return 0;
}