创建抽象基类型引用的初始化列表
Creating an initialization list of abstract base type references
我有两个 classes A,B 继承自抽象基础 class Abs。我想创建一个包含它们的初始化列表。我想用 foreach 循环迭代该列表。
class Abs {
public:
virtual ~Abs() = default;
virtual void f() = 0;
};
class A : public Abs {
virtual void f() override;
};
class B : public Abs {
virtual void f();
};
int main() {
A a;
B b;
const Abs& a_abs = a;
const Abs& b_abs = b;
for (const auto& abs : {a_abs, b_abs})
{
}
return 0;
}
for 循环编译失败:
error: cannot allocate an object of abstract type ‘Abs’
为什么要尝试分配 Abs 类型?
我该如何克服呢?
谢谢:)
您的代码有一些问题:
你应该有一个 public destructor/constructor
B 不继承自 Abs 因此无法转换为 Abs
我不知道你是否可以通过参考获得你想要的东西,但通过指针你可以。请使用智能指针这只是概念教授
#include <initializer_list>
#include <iostream>
class Abs {
public:
virtual ~Abs() = default;
virtual void f() const = 0;
};
class A : public Abs {
public:
virtual void f() const {
std::cout << "A" << std::endl;
}
};
class B : public Abs {
public:
virtual void f() const {
std::cout << "B" << std::endl;
}
};
int main() {
A* a = new A();
B* b = new B();
const Abs* a_abs = dynamic_cast<const Abs *>(a);
const Abs* b_abs = dynamic_cast<const Abs *>(b);
for (const auto* abs : {a_abs, b_abs})
{
abs->f();
}
delete a;
delete b;
return 0;
}
我有两个 classes A,B 继承自抽象基础 class Abs。我想创建一个包含它们的初始化列表。我想用 foreach 循环迭代该列表。
class Abs {
public:
virtual ~Abs() = default;
virtual void f() = 0;
};
class A : public Abs {
virtual void f() override;
};
class B : public Abs {
virtual void f();
};
int main() {
A a;
B b;
const Abs& a_abs = a;
const Abs& b_abs = b;
for (const auto& abs : {a_abs, b_abs})
{
}
return 0;
}
for 循环编译失败:
error: cannot allocate an object of abstract type ‘Abs’
为什么要尝试分配 Abs 类型?
我该如何克服呢?
谢谢:)
您的代码有一些问题:
你应该有一个 public destructor/constructor
B 不继承自 Abs 因此无法转换为 Abs
我不知道你是否可以通过参考获得你想要的东西,但通过指针你可以。请使用智能指针这只是概念教授
#include <initializer_list>
#include <iostream>
class Abs {
public:
virtual ~Abs() = default;
virtual void f() const = 0;
};
class A : public Abs {
public:
virtual void f() const {
std::cout << "A" << std::endl;
}
};
class B : public Abs {
public:
virtual void f() const {
std::cout << "B" << std::endl;
}
};
int main() {
A* a = new A();
B* b = new B();
const Abs* a_abs = dynamic_cast<const Abs *>(a);
const Abs* b_abs = dynamic_cast<const Abs *>(b);
for (const auto* abs : {a_abs, b_abs})
{
abs->f();
}
delete a;
delete b;
return 0;
}