当基类使用虚类时,虚类在类层次结构中的使用 我不理解斯特劳斯特鲁普的C++示例,第43页和第44页。我复制了一个最小的例子来说明我的困惑: #include <iostream> class Shape { public: virtual void draw() const = 0; virtual ~Shape() {}; }; class Circle : public Shape { public: Circle(int p, int rr) : x{p}, r{rr} {} void draw() const { std::cout << "In Circle::draw()" << std::endl; } private: int x; int r; }; class Smiley : public Circle { public: Smiley(int p, int r): Circle{p,r}, mouth(nullptr) {} ~Smiley() { delete mouth; } void draw() const { std::cout << "In Smiley::draw()" << std::endl; } private: Shape* mouth; }; int main(int argc, char *argv[]) { Circle *smiley; smiley = new Smiley(3, 4); smiley->draw(); Circle *circle; circle = new Circle(3, 4); circle->draw(); return 0; }

当基类使用虚类时,虚类在类层次结构中的使用 我不理解斯特劳斯特鲁普的C++示例,第43页和第44页。我复制了一个最小的例子来说明我的困惑: #include <iostream> class Shape { public: virtual void draw() const = 0; virtual ~Shape() {}; }; class Circle : public Shape { public: Circle(int p, int rr) : x{p}, r{rr} {} void draw() const { std::cout << "In Circle::draw()" << std::endl; } private: int x; int r; }; class Smiley : public Circle { public: Smiley(int p, int r): Circle{p,r}, mouth(nullptr) {} ~Smiley() { delete mouth; } void draw() const { std::cout << "In Smiley::draw()" << std::endl; } private: Shape* mouth; }; int main(int argc, char *argv[]) { Circle *smiley; smiley = new Smiley(3, 4); smiley->draw(); Circle *circle; circle = new Circle(3, 4); circle->draw(); return 0; },c++,polymorphism,C++,Polymorphism,请帮忙。这怎么可能?当Circle::draw不是虚拟的时,如何从Circle*指针调用Smiley::draw?当继承权的基类是虚拟的(Shape::draw)时,是否不必为进一步的派生类函数(如Smiley::draw)声明派生类函数为虚拟的(如Circle::draw)?Circle::draw实际上是虚拟的!这是因为Shape::draw是虚拟的。从基类重写虚函数时,该函数自动为虚函数,不需要关键字。我想提供virtual关键字以明确它是一个虚拟函数,但它是可选的 在C++11中,可以标

请帮忙。这怎么可能?当Circle::draw不是虚拟的时,如何从Circle*指针调用Smiley::draw?当继承权的基类是虚拟的(Shape::draw)时,是否不必为进一步的派生类函数(如Smiley::draw)声明派生类函数为虚拟的(如Circle::draw)?

Circle::draw
实际上是虚拟的!这是因为
Shape::draw
是虚拟的。从基类重写虚函数时,该函数自动为虚函数,不需要关键字。我想提供virtual关键字以明确它是一个虚拟函数,但它是可选的

在C++11中,可以标记重写的函数
override
,以确保它们实际上重写了虚拟函数。这可以防止错误

void draw() const override

Circle::draw
实际上是虚拟的!这是因为
Shape::draw
是虚拟的。从基类重写虚函数时,该函数自动为虚函数,不需要关键字。我想提供virtual关键字以明确它是一个虚拟函数,但它是可选的

在C++11中,可以标记重写的函数
override
,以确保它们实际上重写了虚拟函数。这可以防止错误

void draw() const override

我认为答案是,只要draw的第一个声明(在类层次结构的顶部)被声明为虚拟,draw即使没有指定也仍然是虚拟的。

我认为答案是,draw即使没有指定也仍然是虚拟的,只要draw的第一个声明(在类层次结构的顶部)声明为虚拟。

@AdrianoRepetti是的。@AdrianoRepetti它没有重写非虚拟函数。@AdrianoRepetti-是的,它的vtable条目通常会指向一个函数,该函数报告您调用了一个没有实现的纯虚拟函数。哦,该死的,我没有看到
Shape
基类和
virtual void draw()我的坏!!!(编辑只是为了取消投票)@AdrianoRepetti是的。@AdrianoRepetti它没有覆盖非虚拟函数。@AdrianoRepetti-是的,它的vtable条目通常会指向一个函数,该函数报告您调用了一个没有实现的纯虚拟函数。哦,该死的,我没有看到
Shape
基类和
virtual void draw()我的坏!!!(编辑仅用于取消投票)