gpt4 book ai didi

c++ - 指向抽象类的指针的函数重载

转载 作者:行者123 更新时间:2023-11-28 05:16:09 25 4
gpt4 key购买 nike

我在 C++ 中的函数重载方面遇到了一些麻烦。

我有一个类层次结构,其中许多类继承自抽象基类,如下所示:

struct Animal {
virtual void make_noise() = 0;
};

struct Dog : Animal {
void make_noise() { std::cout << "bark\n"; }
};

struct Cat : Animal {
void make_noise() { std::cout << "meow\n"; }
};

struct Lion : Cat {
void make_noise() { std::cout << "roar\n"; }
};

我想要一个根据参数类型具有三种不同实现的函数:

  • 一个指向Animal的子类的指针: Dog * , Lion *
  • 一个用于指向 Animal 的子类的指针 vector : std::vector<Animal *> , std::vector<Lion *>
  • 一个用于所有其他类型,甚至那些不是指针的类型:char * , std::string , int

这是我的尝试:

void f(Animal *x) {
x->make_noise();
}

void f(std::vector<Animal *> x) {
std::cout << "vector\n";
}

template<class T>
void f(T a) {
std::cout << a << "\n";
}

int main() {
f(new Lion);
std::vector<Animal *> x;
f(x);
f(2);
return 0;
}

这是上面程序打印的内容:

0x7febb8d00000
vector
2

这是我想要打印的内容:

roar
vector
2

此外,如果我尝试传递 std::vector<Lion *>而不是 std::vector<Animal *> ,它选择最后一个实现而不是第二个实现并生成编译器错误。

如何在 C++98 中解决这个问题?

最佳答案

一种方法是使用模板特化并在调用 f 时指定模板参数类型,如下所示:

template<class T>
void f(T a) {
std::cout << a << "\n";
}

template<>
void f(Animal *x) {
x->make_noise();
}

template<>
void f(std::vector<Animal *> x) {
std::cout << "vector\n";
}


int main() {
f<Animal *>(new Lion); // specify template param
std::vector<Animal *> x;
f(x);
f(2);
return 0;
}

关于c++ - 指向抽象类的指针的函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42604152/

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