gpt4 book ai didi

c++ - 如何在没有new的情况下在派生对象中使用虚函数?

转载 作者:行者123 更新时间:2023-12-02 08:21:09 25 4
gpt4 key购买 nike

我想使用不同类(从同一基类派生)的对象的虚函数,而不需要a)构造所有对象或b)使用new。请参阅代码示例:

#include <iostream>
class A{
public:
virtual void p(void){std::cout << "Im A" << std::endl;};
};
class B : public A{
public:
virtual void p(void) override {std::cout << "Im B" << std::endl;};
};
class C : public A{
public:
virtual void p(void) override {std::cout << "Im C" << std::endl;};
};

int main(){
bool cond = true; // some condition
A* o1;
if (cond) o1 = new B(); else o1 = new C();
o1->p(); // will call correct p(), i.e. either B::p or C::p but not A::p

A o2 = B();
o2.p(); // will call A::p

A* o3;
B tmp1; C tmp2; // construct both objects altough only one is needed
if (cond) o3 = &tmp1; else o3 = &tmp2;
o3->p(); // will call correct p(), i.e. either B::p or C::p but not A::p

A* o4;
if (cond) {B tmp; o4 = &tmp;} else {C tmp; o4 = &tmp;} // uses address of local variable
o4->p(); // will call correct p(), i.e. either B::p or C::p but not A::p

return 0;
}

我想要 o1 的行为,但不调用 new。 o2 不起作用(调用基类的函数,如果基类是抽象的,则根本不起作用)。 o3 可以工作,但可以构造所有不同的对象,尽管只需要一个对象。 o4 有点“有效”,但使用了对其范围之外的局部变量的引用。

正确/最佳/现代的 C++ 方法是什么?

最佳答案

当您想避免使用 new 但能够根据某些条件使用不同的派生类型时,最好使用辅助函数。

void do_stuff(A& obj)
{
}

int main()
{
bool cond = true; // some condition

if (cond)
{
B tmp;
do_stuff(tmp);
}
else
{
C tmp;
do_stuff(tmp);
}

return 0;
}

关于c++ - 如何在没有new的情况下在派生对象中使用虚函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60727627/

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