我是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"

另外,您可以通过在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
}

甚至更好的是,如果可以避免的话,不要使用指针!!

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

10-13 05:55