一个类可以有虚拟数据成员吗?

时间:2010-09-13 08:32:06

标签: c++ inheritance

class Base{  
    public:  
        void counter();   
    ....   
}

class Dervied: public Base{  
    public:  
        ....  
}

void main()  
{  
     Base *ptr=new Derived;  
     ptr->counter();  
}

为了确定基类指针指向派生类并使用派生成员函数,我们使用“虚拟”。

同样,我们可以将派生数据成员“虚拟”吗? (数据成员是公开的)

9 个答案:

答案 0 :(得分:25)

virtual函数说明符 ...

来自标准文档,

7.1.2 Function specifiers
Function-specifiers can be used only in function declarations.
function-specifier:
inline
virtual
explicit

因此没有任何名为虚拟数据成员

希望它有所帮助...

答案 1 :(得分:15)

不,但你可以创建一个虚函数来返回指向你所谓的虚拟数据成员的指针

答案 2 :(得分:4)

不,在C ++中没有虚拟数据成员。

答案 3 :(得分:2)

我想不是,但你可能会使用虚拟吸气剂和设定器模拟它吗?

答案 4 :(得分:2)

  

为了确定基类指针指向派生类并使用派生成员函数,我们使用“虚拟”。

这是不正确的。我们创建虚函数以允许派生类提供与基础提供的不同的实现。它不用于标识基类指针指向派生类。

  

同样,我们可以将派生数据成员“虚拟”吗? (数据成员是公开的)

只有非静态成员函数才能是虚拟的。数据成员不能。

Here's一个包含更多信息的链接

答案 5 :(得分:2)

不,因为这会以无数种意想不到的方式打破封装。无论您想要实现什么,都可以使用受保护的属性和/或虚拟功能来完成。

此外,虚函数是 dispatch 的一种方法(即选择要调用的函数),而不是选择与成员属性对应的内存位置。

答案 6 :(得分:0)

也许你可以用同样的方式看问题:

class VirtualDataMember{  
    public:  
    ...
}

class DerviedDataMember: public VirtualDataMember{  
    public:  
    ... 
}

class Base{  
    public:  
        VirtualDataMember* dataMember;
        void counter();     
        ...  
}

答案 7 :(得分:0)

一个类不能有一个虚拟成员,例如参见此answer。 但是,使用指针,继承可以拥有类似的东西 和运行时多态。

在以下代码段中,我定义了几何shape的原型, 具有area方法。 picture类具有成员shape* s; shape使用s所指向的picture::show()的方法。 在此设置中,不希望在之前有picture的实例 已经给出了shape的实际实现,因此我们强制picture为 通过添加虚拟虚函数picture::make_real()进行抽象。

// prototypes
class shape
{
    public:
    virtual double area() = 0; // to be defined later
};
class picture
{
    protected:
    shape* s;
    
    virtual void make_real() = 0; // force picture to be abstract
    
    public:
    picture(shape* ptr):
        s{ptr}
    {}
    
    void show()
    {
        std::cout << s->area() << '\n';
    }
};

接下来,我们实际上实现了一个名为shape的{​​{1}}和一个square类型的 picture(从字面上看)具有一个square_picture square

shape

可以使用以下代码段测试// actual implementation class square : public shape { double len; public: square(double l): len{l} {} double area() override { return len*len; } }; class square_picture : public picture { void make_real() override {} // square_picture is not abstract public: square_picture(double l): picture{new square{l}} {} ~square_picture() { delete s; } };

square_picture

输出:

int main()
{
    square_picture A{2.0};
    A.show();
    
    //picture B{nullptr}; // error: picture is abstract
    return 0;
}

答案 8 :(得分:0)

我有一个使用对象数组的基类。我从那个类派生了一个使用不同类型对象数组的新类。这两个变量具有完全相同的名称。两个类都添加了虚拟成员函数来处理数组。这些成员函数可以轻松找到正确的变量。成员函数和它们使用的变量在一个公共范围内。

两个类中的虚拟成员函数几乎相同。只是数组的类型发生了变化。

C++ 模板可以实现相同的结果。