重写嵌套类并返回外部类作为基础是合法的吗?

时间:2015-09-21 20:19:11

标签: c++ inheritance visual-c++ language-lawyer

让我们考虑以下代码:

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是否有正确的功能并调用它,但该标准对此有何规定?并且关于整个类在函数内定义的事实?

感谢。

3 个答案:

答案 0 :(得分:2)

由于ptr指向作为Base::BaseInner子类实例的有效对象,因此代码有效。

在函数内定义的类仅影响定义的范围,即类的名称可见的位置 它等同于在函数外定义类。

答案 1 :(得分:1)

除了泄漏之外,这里没有任何错误。

必须进行虚拟调度。

答案 2 :(得分:1)

本地课程的相关限制是:

  1. 不得在封闭范围内使用具有自动存储持续时间的变量。
  2. 它不应有静态数据成员。
  3. 既然你的班级不这样做,我会说这很好。