Base类的实例化使用派生类没有对象定义使用指针

问题描述 投票:1回答:4

关于this question我看到所有的答案是使用指针的基类(Base *baseObject),然后使用new关键字来实例化基类的不同的实现。

比方说,如果有一个Base类是这样的:

class Base
{
    public:
           int Id;
}

和其它类是这样的:

class A : public Base {...}
class B : public Base {...}

反正是有实例化一个基类对象有条件但不使用的指针,这样的:

Base a;
if (...) a = new A();
else if (...) a = new B()

编辑:

基于评论没有任何力量使用new关键字。

c++
4个回答
2
投票

您可以使用引用,而不是指针。

例如:

Derived d;
Base &b = d;

1
投票

问题是,使用值,而不是指针时,你总是得到相同类型的值。因此,对于这种情况下:

Base b;

变量b不能是什么,但b的一个实例。即使你这样做:

Derived d;
Base b = d; // d is sliced into b

变量db是不同的实例。要做到assignement,编译器必须d的值转换为类型Base的值,就像这样:

double d = 9.5;
int i = d; // i is 9, it sliced the .5

所以,你必须有一些参考,或某种变量,允许不同类型。

Using a reference/pointer

这通常是多态是如何完成的。你让b引用类型,可以参考扩展Base对象的任何实例。

std::unique_ptr<Base> b = std::make_unique<Derived>();

这将创建类型Derived的唯一指针,并将其分配给类型Base的唯一指针。 b现在指向一个Derived对象的实例。

相反,如果你想使用的参考,你必须有一个活着的停留足够的时间来使用它,像一个变量:

void foo(Base& refToBase);

void bar() {
    Derived d;
    foo(d);
} // d is guaranteed to die here.

Using a variant

变体是一类可具有多种类型的值。它只能包含一个值,所以类型之间是“变化”。

例如:

std::variant<int, std::string> v;

v = 12;
v = "text"; 

所以,你可以用它来创建一个变量,可以派生类型有所不同:

std::variant<A, B> a_or_b;

if(...) {
    a_or_b = A{};
} else {
    a_or_b = B{};
}

std::visit(
    [](Base& b) { /* do stuff with the base */ },
    a_or_b
);

0
投票

我不认为如此。

  1. new指针返回到一新创建的对象的关键字。这就是为什么你需要一个基类指针(或特定的一个)来存储它。
  2. 但是,在你的情况更大的问题是Base a;。它已经创建了Base类的对象。所以你想一个指针从派生类分配给新的对象,以你的基类的不同,已存在的对象。

只需使用一个指针,一切都很好:

Base* a;
if (...) a = new A();
else if (...) a = new B();

0
投票

反正是有实例化一个基类对象有条件但没有使用指针

当然:

if(condition) {
    A a;
} else {
    B b;
}
© www.soinside.com 2019 - 2024. All rights reserved.