有人可以清除这些概念并回答这些问题。提前谢谢。
A类是一个基类,有一个名为display的纯虚函数。
var cart = [
{id: 1},
{id: 2},
{id: 3},
{id: 4, q: 5} // q is set because user selected id num 4, five times
];
B类是继承A类的派生类。此外,B会覆盖显示功能
class A
{
public:
virtual void display()const=0;
};
Q1:现在B包含1个重写显示和1个继承纯虚拟显示,对吧?或者由于覆盖而使纯虚拟虚拟世界变得不存在。
我问这个是因为我面临的最终问题是: Q2:假设B确实覆盖了显示功能,现在,如果有新的类
class B:public A
{
public:
void display()const{cout<<"Always"<<endl;}
};
现在,我清楚这个概念,即所有第一级派生类(如B)都必须在它们上面覆盖纯虚函数(来自A类),假设它们是覆盖它,现在如果有一个新的类C派生自一个第一级派生类(B类),它还需要覆盖纯虚函数(显示)还是不需要它因为它在B类中被重写而C继承了B(因此接收了显示函数的覆盖?
答案 0 :(得分:2)
假设有一个虚拟基类
A
class A
{
public:
virtual void display()const=0;
};
class B:public A
{
public:
void display()const{cout<<"Always"<<endl;}
};
Q1:现在B包含1个重写显示和1个继承纯虚拟显示,对吧?或者由于覆盖而使纯虚拟虚拟世界变得不存在。
函数的继承是替换。如您所说,基类函数在派生类中不存在。无论基类功能是否为虚拟,都是如此。
Q2:假设B确实覆盖了显示功能,现在,如果有新的类
C
class C : public B
{
...
};
是否还需要覆盖纯虚函数(显示)?
不,C
获取B的所有功能,包括display()
的具体实现
但是,C
可能可选再次覆盖display()
功能。等等等等。一个类可以被子类化的次数没有限制。
答案 1 :(得分:0)
Q1:现在B包含1个被覆盖的显示和1个继承的纯虚拟显示,对吧?
我不知道你的意思。
C
不需要覆盖display
。如果它没有,它将只使用从B
继承的那个。
答案 2 :(得分:0)
Q1:现在B包含1个重写显示和1个继承纯虚拟显示,对吧?或者由于覆盖而使纯虚拟虚拟世界变得不存在。
这里的第一个问题毫无意义。类B
从A
继承纯虚拟,并覆盖它。它也没有“包含”。
A::display()
确实存在,作为可在B
内引用的有效命名实体。例如,如果定义了A::display()
;
class A
{
public:
virtual void display()const=0;
};
// yes, defining a pure virtual function is allowed, albeit optional
void A::display() const
{
std::cout << "A!\n";
}
然后B::display()
可以调用它。
class B:public A
{
public:
void display()const
{
A::display();
std::cout<<"Always"<<endl;
}
};
所以在这种情况下都存在A::display()
和B::display()
。 B::display()
的上述代码将编译(因为编译器将A::display()
和B::display()
识别为函数的不同名称),无论是否定义A::display()
。 (如果未定义A::display()
,链接器通常会报告缺少的符号。
Q2:假设B确实覆盖了显示功能,现在,如果有新类
class C:public B { public: };
现在,我清楚地知道所有第一级派生类(如B)都必须在它们上面覆盖纯虚函数(来自A类),假设它们会覆盖它,现在如果有一个新的类C派生自一个第一级派生类(B类),它还需要覆盖纯虚函数(显示),还是不需要它,因为它在B类中重写,C继承B(因此接收显示函数的覆盖?
如果B
已覆盖display()
,则C
会将display()
作为非纯虚函数继承。这意味着,如果B
可以实例化,那么C
也可以。
如果C
未覆盖继承的display()
,则some_c->display()
将调用从B
继承的版本,即B::display()
。
如果C
覆盖display()
- 任何继承的虚函数允许 - 那么它可以以任何方式实现C::display()
。
答案 3 :(得分:0)
现在B包含1个被覆盖的显示和1个继承的纯虚拟显示,对吧?
NO。
你可以这样理解:
或者由于覆盖而使纯虚拟虚拟世界变得不存在。
当您声明一个虚拟函数时,会添加一个虚拟(函数)表(对于类),该表包含指向虚函数的函数指针。每当声明覆盖函数时,它都会替换虚拟表中的函数指针。
如果B
覆盖了该函数,那么它的函数指针就会进入虚拟表。
C
不必覆盖。它将从B
获得函数。
C
可以覆盖该功能。然后它的指针将进入虚拟表。
B
不必覆盖。但是,无法创建B
的变量。然后C
应该覆盖该函数(如果你想要一个变量)