C++ 纯虚函数的继承
有人能澄清这些概念并回答这些问题吗。先谢谢你 类A是一个基类,具有一个名为display的纯虚拟函数C++ 纯虚函数的继承,c++,oop,c++11,C++,Oop,C++11,有人能澄清这些概念并回答这些问题吗。先谢谢你 类A是一个基类,具有一个名为display的纯虚拟函数 class A { public: virtual void display()const=0; }; 类B是继承类a的派生类。此外,B覆盖显示功能 class B:public A { public: void display()const{cout<<"Always"<<endl;} }; 现在,我很清楚所有一级派生
class A
{
public:
virtual void display()const=0;
};
类B是继承类a的派生类。此外,B覆盖显示功能
class B:public A
{
public:
void display()const{cout<<"Always"<<endl;}
};
现在,我很清楚所有一级派生类(如B)都必须重写纯虚函数(来自类a),假设它们确实重写了它,那么如果有一个新的类C是从一级派生类(类B)派生的呢,它还需要重写纯虚拟函数(display)吗?还是不需要它,因为它在类B中被重写,而C继承B(从而接收display函数的重写)
Q1:现在B包含1个覆盖显示和1个继承的纯虚拟显示,对吗
我不知道你这是什么意思
C
不需要重写display
。如果不重写,它将只使用从B
继承的
Q1:现在B包含1个覆盖显示和1个继承的纯虚拟显示,对吗
我不知道你这是什么意思
C
不需要重写display
。如果不重写,它将只使用从B
继承的
假设有一个虚拟基类a
它是否也需要覆盖纯虚拟功能(显示)
否,C
从B获取所有函数,包括display()
但是,C
可以选择再次重写display()
函数。依此类推。对类的子类化次数没有限制
假设有一个虚拟基类a
它是否也需要覆盖纯虚拟功能(显示)
否,C
从B获取所有函数,包括display()
但是,C
可以选择再次重写display()
函数。依此类推。对类的子类化次数没有限制
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";
}
因此在这种情况下,A::display()
和B::display()
都存在。无论是否定义了A::display()
,上面的B::display()
代码都将编译(因为编译器将A::display()
和B::display()
都识别为不同的函数名)。(如果未定义A::display()
,链接器通常会报告缺少的符号)
问题2:假设B重写了显示函数,现在,如果有一个新类
class C:public B
{
public:
};
现在,我很清楚所有一级派生类(如B)都必须重写纯虚函数(来自类a),假设它们确实重写了它,那么如果有一个新的类C是从一级派生类(类B)派生的呢,它是否也需要重写纯虚拟函数(display),还是不需要,因为它在类B中被重写,而C继承了B(从而接收对display函数的重写)
如果B
已重写display()
,则C
将display()
继承为非纯虚拟函数。这意味着,如果B
可以实例化,那么C
也可以实例化
如果C
没有覆盖继承的display()
,那么一些display()
将调用从B
继承的版本,即B::display()
如果C
确实覆盖了display()
——这是任何继承的虚拟函数所允许的——那么它可以根据需要以任何方式实现C::display()
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";
}
因此在这种情况下,A::display()
和B::display()
都存在。无论是否定义了A::display()
,上面的B::display()
代码都将编译(因为编译器将A::display()
和B::display()
都识别为不同的函数名)。(如果未定义A::display()
,链接器通常会报告缺少的符号)
问题2:假设B重写了显示函数,现在,如果有一个新类
class C:public B
{
public:
};
现在,我很清楚所有一级派生类(如B)都必须重写纯虚函数(来自类a),假设它们确实重写了它,那么如果有一个新的类C是从一级派生类(类B)派生的呢,它是否还需要覆盖纯虚拟功能(显示)或
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";
}
class B:public A
{
public:
void display()const
{
A::display();
std::cout<<"Always"<<endl;
}
};
class C:public B
{
public:
};