【发布时间】:2013-05-08 14:58:50
【问题描述】:
我们在Cpp中使用virtual来实现动态绑定,即在运行时根据创建的实际对象而不是引用或指针来决定必须调用哪个函数变量。
class A
{
int a;
public:
virtual void show();
};
void A::show() { cout<<a<<endl; }
class B:public A
{
int b;
public:
void show() { cout<<b<<endl; }
};
class C:public A
{
int c;
public:
void show() { cout<<c<<endl; }
};
假设,someFunction(A& aref)。它可以采用 B 或 C 或 A 类型的对象
注意:假设设置了数据成员的值
我的意思是定义了路径(可以是 A 或 B 或 C)。这不完全是run time dependent [就像要求用户输入年龄并且用户输入一些单词或一些其他数据类型]。
但是为什么将其称为run time binding?
编译器会事先检查要分配的对象是否兼容
或者没有。
是用来表示引用变量与特定类型的对象没有严格关联的术语,它是在运行时决定的。 还有更多吗?
【问题讨论】:
-
它是动态的,因为虚拟方法调用不能在编译时完全解析(当通过指针或引用调用时);它们只能解析为特定的 vtable 指针。该指针将指向哪个方法在编译时是未知的。
-
“我的意思是定义了路径(可以是 A 或 B 或 C)。” 如果您正在构建库,它也可以是完全不同的类型。在这种情况下,您的库的使用者可以定义他们自己的类型,因此在编译您的库时不可能知道从 A 派生的所有类型的集合。
-
@cdhowie。好的。我没有考虑过它是一个库并在未来拥有派生类。感谢您朝着正确的方向前进
标签: c++ inheritance dynamic virtual language-lawyer