虚函数不起作用

时间:2016-04-26 21:48:03

标签: c++-cli

每次我调用Draw方法时,它总是调用基类...

   #pragma once
    #include <pch.h>

    class A
    {
    public:
        A();

        virtual void Draw(CanvasDrawingSession^ drawingSession);
    };

B类派生自A

#pragma once
#include <pch.h>
#include <A.h>

class B: public A
{
public:
    B();

    void Draw(CanvasDrawingSession^ drawingSession);
};

当我使用派生类对象A a = B()初始化基类对象并调用Draw方法 - a.Draw()时,它总是从基类调用Draw()。我做错了什么?

1 个答案:

答案 0 :(得分:2)

代码      A = B() 构造一个B类型的实例,然后将它分配给A类型的变量。编译器为您生成了一个默认的复制构造函数......

A::A(const A&)

...适用于B类型变量的赋值,因为B的任何实例都是A类型的实例(因为它是&#39;的子类A)。

此效果称为object slicing

为了让您的代码有效,请不要丢弃B - ness。例如,你可以这样做:

B the_b = B();
A* a_ptr = &the_b;
a_ptr->Draw()

这将调用B::Draw()