每次我调用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()。我做错了什么?
答案 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()
。