【发布时间】:2023-02-01 23:07:37
【问题描述】:
我有名为“Base”和“Derived”的课程。
struct Base {
Base() = default;
virtual ~Base() = default;
Base(const Base&) = delete;
Base& operator=(const Base&) = delete;
virtual void DoStuff() = 0;
};
“Base”类需要虚拟析构函数,这是可以理解的。我也不允许复制这个类
struct Derived : Base {
Derived() = default;
~Derived() override = default;
void DoStuff() override { /*...*/ }
};
int main()
{
std::shared_ptr<Base> a = std::make_shared<Derived>();
a->DoStuff();
return 0;
}
现在让我们介绍其他类,我不知道,Callable和DerivedCallable
struct Callable
{
virtual void Call() = 0;
};
struct DerivedCallable : Base, Callable
{
DerivedCallable() = default;
~DerivedCallable() override = default;
void DoStuff() override { /*...*/ }
void Call() override { /*...*/ }
};
int main()
{
std::shared_ptr<Base> a = std::make_shared<Derived>();
a->DoStuff();
{
auto callableA = std::dynamic_pointer_cast<DerivedCallable>(a);
if(callableA) {
callableA->Call();
}
}
std::shared_ptr<Base> b = std::make_shared<DerivedCallable>();
b->DoStuff();
{
auto callableB = std::dynamic_pointer_cast<DerivedCallable>(b);
if(callableB) {
callableB->Call();
}
}
return 0;
}
Derived没有继承自Callable,所以callableA是nullptr,因此if语句不会执行Call()函数。
另一方面,DerivedCallable 继承自 Callable,std::dynamic_pointer_cast 会将对象的引用计数增加到 2,因此当 callableB 超出范围时,对象不会被释放,只有引用计数将减少到 1,然后主函数将释放 b。
Callable 需要有一个虚拟析构函数吗?
【问题讨论】:
-
自己看看:en.cppreference.com/w/cpp/types/is_polymorphic。在你的类型上使用它。顺便问个好问题,+1
-
@Edziju Base& operator(const Base&) = delete; 是什么?和派生()=默认值;派生()覆盖=默认;?
-
我的错,应该是
operator=和~Derived() override = default。
标签: c++