2010-12-07 66 views
1
  1. virtual public & public virtual?如果是,那为什么?
  2. 为什么所有的类都不是虚拟的?

实施例:C++虚拟课程基本问题

class x { 
    protected: int a; 
}; 

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

解答2:使用虚拟类的性能受到影响。每个虚拟类具有存储非虚拟类不具有的虚拟功能表的开销。 – Nick 2010-12-07 15:18:50

回答

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++让你选择。

0

1)是否有const int的和INT常量之间的差?没有。 2.)具有虚函数的类被称为多态类。我建议你在这儿读: http://www.geekinterview.com/question_details/51645

+0

`int const *`和`int * const` ;-)之间有一个区别此外,问题与虚拟**继承有关**,而不是虚拟功能。先发制人的评论:虚拟继承是一个与多重继承有关的实际C++概念,请看它。 – 2010-12-07 14:27:16

+0

谢谢你的第一个答案。但你还没有回答我的第二个问题。我已经阅读过虚拟课程,所以我想知道为什么不是所有的课程都是虚拟的?为什么不默认虚拟类?为什么我们需要写虚拟?不虚拟好多了? – ropio 2010-12-07 14:31:43

+0

@Victor我认为他的意思是虚拟功能。 @ropio你基本上都在问同样的事情。为什么默认情况下并非一切皆为虚拟?那么,因为你只在需要时才使用它。这种事情有一定的用途。这个链接应该可以帮到你:http://it.toolbox.com/wiki/index.php/What_is_virtual_inheritance_and_how_is_it_used%3F – Lockhead 2010-12-07 14:43:56

2

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

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