【发布时间】:2018-06-14 21:27:35
【问题描述】:
我想知道运行时多态性的可用替代方案,特别是在我的类之间使用公共基类的替代方案,以便存储派生类的实例并与之交互。 RTP 存在通过 vtable 查找间接的缺点,并且还强制派生类存储为指针,因此通常必须动态分配它们。据我所知,这会阻碍内联和编译器优化。
简而言之,我不想要这个:
class Animal
{
public:
virtual void noise() const = 0;
};
class Dog : public Animal
{
public:
virtual void noise() override const {std::cout<<"Woof!\n";};
};
class Cat : public Animal
{
public:
virtual void noise() override const {std::cout<<"Meow!\n";};
};
//...
std::vector<Animal*> animals;
我想要这样的东西:
class Dog
{
public:
void noise() const {std::cout<<"Woof!\n";};
};
class Cat
{
public:
void noise() const {std::cout<<"Meow!\n";};
};
//...
std::vector<*Things that have noise()*> animals;
【问题讨论】:
-
如果您要问这样的问题,请提供与您的问题领域相关的示例,而不是这些愚蠢的动物/狗东西。
-
C++ 是一种静态类型语言。您不能有
vector<T>,其中T不是固定类型。您可以做的最好的事情是类型擦除(请参阅std::function),但这在多态函数调度、堆分配等方面并不比基类更好。唯一真正的改进是它可以管理自己的内存。只要所涉及的类集不受限制(因此variant不合适),您将不得不为多态调度付费。而且它不像variant访问是免费的什么的...... -
您提到内联是一个理想的目标,并且您提供了一个“具有噪声()的事物”的向量示例。您如何看待这项工作?承担编译器的角色。假设向量已经填充了一些东西。您无法知道那是什么,但假设我们已经检查过它是否存在。你将如何内联表达式
animals[0].noise()?或者甚至在没有某种程度的间接的情况下评估该表达式?
标签: c++ polymorphism c++17 static-polymorphism