关于动态绑定的问题[英] questions about dynamic binding

问题描述

你好,

我有一些与动态绑定有关的问题.示例程序
是:

#include<iostream>

使用命名空间标准;

A类{
公开:
虚空 f(){cout <<"A::f()"<<结束;}
};

B类:公共A{
公开:
void f(){cout <<"B::f()"<<结束;}
};

int main(){
乙乙;
A* bp = &b;
//A* bp2 = 新 B(*bp);
A* bp2 = 新 A(*bp);
bp2->f();
bp->f();
返回0;
}

正如我所预料的那样,"bp->f()"调用 B' 的 f().然而,"bp2->f()"打电话给A的
F().是不是因为"新A",它只复制了A的部分
"*bp"对象,还是因为合成的行为
A 的复制构造函数?如果是后者,那我可以创建一个B
通过为 A 定义我自己的复制构造函数来创建对象?

另外,被注释掉的语句产生了编译器
错误.它说"没有匹配函数调用''B::B(A&)''".不能
编译器发现 *bp 实际上是一个 B 对象?

谢谢,
Jess

推荐答案

//bp指向对象b,即使是A类的指针.
A* bp = &b;

//所以应该调用成员函数 B::f.
bp->f();

//bp2指向A类的一个对象.
A* bp2 = 新 A(*bp);

//所以应该调用成员函数 A::f.
bp2->f();

关于语句 A* bp2 = new A(*bp);
如果类 A 没有任何复制构造函数,编译器将使用默认的
复制构造函数来构造一个新对象.
A::A(const A&a),
因为B类派生自A类,所以编译器会使用A的部分
对象B构造类A的对象.

如果为A类写一个重载拷贝构造函数,比如
A::A( 常量 B& b),
编译器会使用你自定义的拷贝构造函数来创建
的对象A类
>>它说"没有匹配函数调用''B::B(A&)''".编译器不能发现 *bp 实际上是一个 B 对象吗?
是的,编译时报错,运行时动态绑定
时间.所以编译器无法知道一个指针是否指向它的实际
编译时的对象.

"杰斯"<wd***@hotmail.com>
??????:11********************@u30g2000hsc.googlegr oups.com...
你好,

我有一些与动态绑定有关的问题.示例程序
是:

#include<iostream>

使用命名空间标准;

A类{
公开:
虚空 f(){cout <<"A::f()"<<结束;}
};

B类:公共A{
公开:
void f(){cout <<"B::f()"<<结束;}
};

int main(){
乙乙;
A* bp = &b;
//A* bp2 = 新 B(*bp);
A* bp2 = 新 A(*bp);
bp2->f();
bp->f();
返回0;
}

正如我所预料的那样,"bp->f()"调用 B' 的 f().然而,"bp2->f()"打电话给A的
F().是不是因为"新A",它只复制了A的部分
"*bp"对象,还是因为合成的行为
A 的复制构造函数?如果是后者,那我可以创建一个B
通过为 A 定义我自己的复制构造函数来创建对象?

另外,被注释掉的语句产生了编译器
错误.它说"没有匹配函数调用''B::B(A&)''".不能
编译器发现 *bp 实际上是一个 B 对象?

谢谢,
Jess


5 月 12 日晚上 8:33,"Paolo Maldini"<jifang1...@msn.com 写道:
关于语句 A* bp2 = new A(*bp);
如果类 A 没有任何复制构造函数,编译器将使用默认的
复制构造函数来构造一个新对象.
A::A(const A&a),
因为B类派生自A类,所以编译器会使用A的部分
对象 B 构造类 A 的对象.
那么,这是编译器的默认行为吗?
如果为A类写一个重载拷贝构造函数,比如
A::A( 常量 B& b),
编译器会使用你自定义的拷贝构造函数来创建
的对象A类.
有没有办法可以重载复制构造函数,以便
创建的对象实际上是 B 类的吗?

谢谢,
Jess


2007-05-12 12:13,Jess 写道:
你好,

我有一些与动态绑定有关的问题.示例程序
是:

#include<iostream>

使用命名空间标准;

A类{
公开:
虚空 f(){cout <<"A::f()"<<结束;}
};

B类:公共A{
公开:
void f(){cout <<"B::f()"<<结束;}
};

int main(){
乙乙;
A* bp = &b;
//A* bp2 = 新 B(*bp);
A* bp2 = 新 A(*bp);
bp2->f();
bp->f();
返回0;
}

正如我所预料的那样,"bp->f()"调用 B' 的 f().然而,"bp2->f()"打电话给A的
F().是不是因为"新A",它只复制了A的部分
"*bp"对象,还是因为合成的行为
A 的复制构造函数?
这是因为 new A() 会创建一个 A 类型的新对象,所以在做的时候
bp2->f() 会调用bp2指向的对象的f()方法
(恰好是 A 型).当你做 bp->f() 的类型时
指向的对象属于 B 类型,因此它的 f() 被调用.
如果是后者,那我可以自己定义一个B对象吗
A 的复制构造函数?
不,对象中的任何构造函数(不管它是否是正常的
T 类型的构造函数或复制构造函数)将创建
的对象键入 T,所以当你执行 ''new A()'' 时,对象的类型将始终是 A
(因为那是您指定的).
另外,被注释掉的语句产生了编译器
错误.它说"没有匹配函数调用''B::B(A&)''".不能
编译器发现 *bp 实际上是一个 B 对象?
不,bp 是指向 A 类型对象的指针,您可以强制转换
指向 B 类型指针的指针或在 B 中创建一个构造函数,该构造函数采用
一个 A 作为参数.

--
Erik Wikstr?m

本文地址:https://www.itbaoku.cn/post/1050399.html