gpt4 book ai didi

c++ - 如何选择调用的重载函数

转载 作者:可可西里 更新时间:2023-11-01 17:57:22 27 4
gpt4 key购买 nike

我是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;
}

最佳答案

如果你知道你正在处理一个 C2 对象,你可以先转换为一个 C2 指针:

func(*teste1);                   // Want "Func 1"
func(*static_cast<C2*>(teste2)); // Want "Func 2"

或者,您可以通过在 C1 中使用虚函数来使 C2 多态:

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
}

或者更好的是,如果可以避免的话,根本不要使用指针!!

关于c++ - 如何选择调用的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com