【发布时间】:2022-01-18 14:15:25
【问题描述】:
我正在学习 C++ 中的多态性,但我不能将指针向下转换为指针。我有一个类 Base 和一个扩展 Base 的类 Derived。我想使用函数Base **derivedFactory(size_t size) 做一个派生对象池。我尝试做Base** array = new Derived*[size];,但编译器说它不能从 Derived** 转换为 Base**。所以我尝试了下一个:
Base **derivedFactory(size_t size)
{
Base* array = new Derived[size];
for (size_t idx = 0; idx < size; ++idx)
{
Derived derived = Derived();
array[idx] = derived;
}
Base** arrayBase = &array;
return arrayBase;
}
然后编译。但是当我想访问所有派生对象时,main.cc 会抛出一个Segmentation fault (core dumped)。它执行 hello(cout) 但在结束循环的第一次迭代之前抛出。
你能帮帮我吗?
Main.cc
#include "main.ih"
int main()
{
Base **bp = derivedFactory(10);
for (size_t idx = 0; idx <= 10; ++idx)
{
bp[idx]->hello(cout);
cout << "Not printing\n";
}
}
类基:
class Base
{
private:
virtual void vHello(std::ostream &out)
{
out << "Hello from Base\n";
}
public:
void hello(std::ostream &out)
{
vHello(out);
}
};
类派生:
class Derived : public Base
{
std::string d_text;
private:
void vHello(std::ostream &out) override
{
out << d_text << '\n';
}
public:
Derived()
{
d_text = "hello from Derived";
}
virtual ~Derived()
{}
};
谢谢!
【问题讨论】:
-
如果你想要一个“派生池”,这意味着一个派生数组,所以一个指针,因此你应该返回一个
Base*而不是Base**。使用这样的原始指针被认为是不好的做法,因为您可能会忘记使用delete释放资源。另外Derived derived = Derived();正在创建一个临时Derived并将其复制到derived。请改用Derived derived;。 -
@Offtkp:“Derived derived = Derived(); 正在创建一个临时 Derived 并将其复制到 derived。”这不是真的。
标签: c++ pointers polymorphism downcast