virtual public
&public virtual
?如果是,那为什么?- 为什么所有的类都不是虚拟的?
实施例:C++虚拟课程基本问题
class x {
protected: int a;
};
class y : public virtual x {
protected: int b;
};
virtual public
& public virtual
?如果是,那为什么?实施例:C++虚拟课程基本问题
class x {
protected: int a;
};
class y : public virtual x {
protected: int b;
};
要了解虚拟和非虚拟继承检查的区别(并尝试了解)代码:
#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;
}
它很容易,如果你把它想象这样的理解:
有时候,很高兴有可能在不同的基地存储不同的变量值。有时候则相反。 C++让你选择。
1)是否有const int的和INT常量之间的差?没有。 2.)具有虚函数的类被称为多态类。我建议你在这儿读: http://www.geekinterview.com/question_details/51645
`int const *`和`int * const` ;-)之间有一个区别此外,问题与虚拟**继承有关**,而不是虚拟功能。先发制人的评论:虚拟继承是一个与多重继承有关的实际C++概念,请看它。 – 2010-12-07 14:27:16
谢谢你的第一个答案。但你还没有回答我的第二个问题。我已经阅读过虚拟课程,所以我想知道为什么不是所有的课程都是虚拟的?为什么不默认虚拟类?为什么我们需要写虚拟?不虚拟好多了? – ropio 2010-12-07 14:31:43
@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
没有,据我记得。但以下约定是首选(参考:MSDN)
虚拟[类型说明符]成员函数声明符
虚拟[访问说明符]基类名
下面的链接具有良好的该示例的交代你上述http://www.parashift.com/c++-faq-lite/multiple-inheritance.html
对于初学C++程序员列出,http://www.parashift.com/c++-faq-lite/index.html#table-of-contents作为很好的参考点之一
不,public virtual
和virtual public
之间没有区别,它们是两个无关的说明符(一个决定继承关系的可见性,另一个决定关系是否为虚拟关系),可以自由交换。
继承是虚拟还是不存在语义上的区别(如果D继承自B和C,它们都是从A继承的,那么虚拟继承意味着只有A的一个实例存在并由B和C共享,非虚拟继承意味着将出现两个实例)。有时候,你想要一个实例,有时你需要两个。语言设计者必须选择默认值,并选择非虚拟继承,因此您需要明确要求虚拟继承。
解答2:使用虚拟类的性能受到影响。每个虚拟类具有存储非虚拟类不具有的虚拟功能表的开销。 – Nick 2010-12-07 15:18:50