让我们考虑以下代码:
class Base{
protected:
struct BaseInner{
virtual void func() = 0;
};
BaseInner* ptr;
public:
void func(){
if (ptr){
ptr->func();
}
}
};
Base generateBase(){
class Driven : public Base{
protected:
class DrivenInner : public Base::BaseInner{
virtual void func() override{
std::cout << "driven class\n";
}
};
public:
Driven() { ptr = new DrivenInner(); }
};
return Driven();
}
int main()
{
auto base = generateBase();
base.func();
return 0;
}
(让我们留下内存泄漏)
由generateBase
制作的切片本身是合法的,但调用ptr->func()
是合法的吗?从逻辑上讲,程序会询问vtable是否有正确的功能并调用它,但该标准对此有何规定?并且关于整个类在函数内定义的事实?
感谢。
答案 0 :(得分:2)
由于ptr
指向作为Base::BaseInner
子类实例的有效对象,因此代码有效。
在函数内定义的类仅影响定义的范围,即类的名称可见的位置 它等同于在函数外定义类。
答案 1 :(得分:1)
除了泄漏之外,这里没有任何错误。
必须进行虚拟调度。
答案 2 :(得分:1)
本地课程的相关限制是:
既然你的班级不这样做,我会说这很好。