c++ 如何通过虚函数运行所有继承的函数?

x4shl7ld  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(134)

假设我有一个类parent,继承的类是child1child2child3,都继承了parent的函数TellName,我想知道有没有办法调用类的父类TellName函数,自动运行child1child2child3的所有函数。

  • 可视化:*
class parent
{
public:
    virtual void TellName() { }
};

class child1 : public parent
{
public:
    void TellName() override { std::cout<<"Child1"<<"\n"; }
};

class child2 : public parent
{
public:
    void TellName() override { std::cout<<"Child2"<<"\n"; }
};

class child3 : public parent
{
public:
    void TellName() override { std::cout<<"Child3"<<"\n"; }
};
  • 现在我想运行parentTellName函数,并获得如下输出:*
>> Child1
>> Child2
>> Child3

我假设通过使用函数TellName的VTable是可能的。希望我的问题是清楚的。

8xiog9wr

8xiog9wr1#

使用虚函数来完成你所要做的事情的唯一标准方法是示例化所有类型的对象,并在它们上面调用TellName()函数,例如:

int main()
{
    child1 c1;
    child2 c2;
    child3 c3;
    c1.TellName();
    c2.TellName();
    c3.TellName();
}

或者,既然你让TellName()函数virtual,你可以把所有这些对象放在一个容器中,并通过从parent的指针调用TellName()来打印名称。

int main()
{
    std::vector<std::unique_ptr<parent>> vec;
    vec.push_back(std::make_unique<child1>());
    vec.push_back(std::make_unique<child2>());
    vec.push_back(std::make_unique<child3>());
    for (auto& ptr : vec) {
        ptr->TellName();
    }
}

但是,如果你想打印这些名字而不示例化子对象,那么你不需要也不应该使用virtual函数,相反你可以使用static函数。

相关问题