C ++虚拟类基本问题

时间:2010-12-07 14:18:47

标签: c++ class programming-languages virtual

  1. virtual public&之间是否有任何区别public virtual?如果是,那为什么呢?
  2. 为什么所有课程都不是虚拟的?
  3. 示例:

    class x { 
       protected: int a; 
    };
    
    class y : public virtual x {  
       protected: int b; 
    };
    

4 个答案:

答案 0 :(得分:2)

不,public virtualvirtual public之间没有区别,它们是两个不相关的说明符(一个确定继承关系的可见性,另一个确定关系是否为虚拟关系),可以是自由交换。

继承是虚拟的还是没有(如果D继承自B和C,它们都继承自A,那么虚拟继承意味着只有A的一个实例将存在并由B和C共享,而非 - 虚拟继承意味着将存在两个实例)。有时候,你想要一个实例,有时你想要两个实例。语言设计者必须选择默认值,并选择非虚拟继承,因此您需要明确要求虚拟继承。

答案 1 :(得分:0)

1。)const int和int const之间有区别吗?没有。 2.)具有虚函数的类称为多态类。我建议你在这里阅读: http://www.geekinterview.com/question_details/51645

答案 2 :(得分:0)

  1. 不记得。但优先遵循惯例(参考:MSDN)

    virtual [type-specifiers] member-function-declarator

    virtual [access-specifier] base-class-name

  2. 以下链接可以很好地解释您在上面列出的示例http://www.parashift.com/c++-faq-lite/multiple-inheritance.html

  3. 对于新手C ++程序员,http://www.parashift.com/c++-faq-lite/index.html#table-of-contents是一个很好的参考点

答案 3 :(得分:0)

了解虚拟和非虚拟继承检查(并尝试理解)代码之间的区别:

#include <iostream>

using namespace std;

struct Base { 
       int a; 
};

struct D11 :    virtual Base    {};
struct D12 :    virtual Base    {};
struct D21 :    Base    {};
struct D22 :    Base    {};

struct E1: D11, D12 {
    std::pair<int, int> func(int i1, int i2){
        dynamic_cast<D11*>(this)->a = i1;
        dynamic_cast<D12*>(this)->a = i2;
        return std::pair<int, int>(dynamic_cast<D11*>(this)->a, dynamic_cast<D12*>(this)->a);
    }
};

struct E2: D21, D22 {
    std::pair<int, int> func(int i1, int i2){
        dynamic_cast<D21*>(this)->a = i1;
        dynamic_cast<D22*>(this)->a = i2;
        return std::pair<int, int>(dynamic_cast<D21*>(this)->a, dynamic_cast<D22*>(this)->a);
    }
};

int main(){
    E1 e1;
    E2 e2;
    std::pair<int, int>  p1, p2;
    p1 = e1.func(1,2);
    p2 = e2.func(3,4);
    cout << "p1: " << p1.first << ", " << p1.second << endl; // Will return p1: 2, 2
    cout << "p2: " << p2.first << ", " << p2.second << endl; // will return p2: 3, 4
    return 0;
}

如果你想象它会更容易理解: alt text

有时候有可能在不同的基础上存储不同的变量值。有时相反。 C ++让你选择。