我正在学习面向对象的C,并有一个关于虚拟/纯虚拟和多级继承的问题。
假设我有这样的简单代码:
class Shape
{
virtual int getWidth() = 0;
};
class Rectangle: public Shape
{
private:
int length, width;
public:
Rectangle(_length, _width) { length = _length; width = _width }
int getWidth() { return width }
};
class Square: public Rectangle
{
private:
int length;
public:
Square(int _length):Rectangle(_length, _length) { length = _length };
int getWidth() { return length+1 }; //arbitarily add 1 to distinguish
};
int main()
{
Rectangle* r = new Square(5);
std::cout << r->getWidth << std::endl; //prints 6 instead of 5? It's as if rectangles getWidth is virtual
}
我的理解是,除非getWidth被指定为虚拟,否则多态将使用“Base”类的函数。我的意思是r-的最终调用
在这种情况下,我注意到如果我删除Shape中的纯虚拟声明,我们会得到我刚才描述的行为。在基类中有一个纯虚函数会自动使该函数的所有定义都是虚的吗?
你不需要有一个纯虚函数来获得多态行为。普通的虚函数也可以完成它。
是的,在类中将函数指定为<code>virtual</code>意味着它在从它派生的所有类中都保持<code>virtual</code>。
从C 11开始,还有overide
说明符:
在成员函数声明或定义中,overide
确保函数是虚拟
并且正在覆盖基类中的虚函数。
虚拟
被继承。如果您使父函数<code>虚拟</code>,那么它将在所有子类中保持<code>虚</code<。
其实,类似的问题这里问过,那里问过,但回答都不满意。代码示例是 输出为 关于 由于是虚函数,派生类不实现它,因此程序将调用; 则程序将调用; 是一个常规函数,程序将调用; 也是一个常规函数,程序将调用; 我不明白的部分来了,不是虚函数,是属于的指针,基本上只能访问中的函数!但输出是 相比之下,会像我想的那样调用。 在基类指针只能访问基类和虚函数中定义的函数的原则与实际输出之间似乎存在矛盾。原因也无
本文向大家介绍C++中虚函数与纯虚函数的用法,包括了C++中虚函数与纯虚函数的用法的使用技巧和注意事项,需要的朋友参考一下 本文较为深入的分析了C++中虚函数与纯虚函数的用法,对于学习和掌握面向对象程序设计来说是至关重要的。具体内容如下: 首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承、动态绑定。通过数据抽象,可以使类的接口与实现分离,使
在 C++中,可以将虚函数声明为纯虚函数,语法格式为: virtual 返回值类型 函数名 (函数参数) = 0; 纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上 ,表明此函数为纯虚函数。 最后的 并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。 包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。
本文向大家介绍C++ 虚函数和纯虚函数的区别分析,包括了C++ 虚函数和纯虚函数的区别分析的使用技巧和注意事项,需要的朋友参考一下 首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函
我在嵌入式环境中使用 C,其中虚拟函数的运行时确实很重要。我读过关于可以内联虚拟函数的罕见情况,例如:内联虚函数真的是无意义的吗?接受的答案指出,只有在运行时已知确切的类时,例如在处理本地、全局或静态对象(不是指针或对基类型的引用)时,才有可能进行内联。我理解这背后的逻辑,但我想知道在以下情况下是否也可以内联: 从我的观点来看,编译器应该在编译时知道的最终类型,因为它是一个最终类。在这种情况下,是
为什么一个虚函数在派生类中默认是虚的,甚至不可能在派生类中完全移除虚性,这有什么好的理由吗? 我希望这种行为的原因与我不希望默认情况下每个函数都是的原因相同。编译器可能会生成牺牲性能的vtables。 基类应该有一个vtable(我想要多态性在那里),但派生类没有vtable(我不希望多态性在那里,为什么我要那样,只是因为它派生了一个具有多态性的类?)。 我想解决的问题是更好地理解虚函数。我只是没