我知道它使用的是派生类对象的地址,其中需要基类对象的地址。
例:
#include <iostream>
#include <string>
using namespace std;
class A {
public:
void display() {
cout << "\nThis is in class A\n";
}
};
class B : public A {
public:
void display() {
cout << "\nThis is in class B\n";
}
};
void function(A* x) {
x->display();
}
int main() {
A* pa = new A;
B* pb = new B;
function(pa);
function(pb); // Upcasting
return 0;
}我还可以说,Upcasting使用的是派生类的对象,其中需要基类的对象吗?(请注意,我省略了此处的地址一词)
Eg:#include <iostream>
#include <string>
using namespace std;
class A {
public:
void display() {
cout << "\nThis is in class A\n";
}
};
class B : public A {
public:
void display() {
cout << "\nThis is in class B\n";
}
};
void function2(A x) {
x.display();
}
int main() {
A a;
B b;
function2(a);
function2(b); // Upcasting? Is it?
return 0;
}最后,如果继承是私有的而不是公共的,那么第一种情况是否仍然是?--我的意思是,现在,派生类对象不能作为基类对象作为基类接口来处理。
发布于 2015-04-03 04:23:45
当调用第二个function2时,创建A类型的实例(这是function2的参数x),并从B类型的b中分配(或复制)。
所以这两张都是A级的。
只有当父类型指针引用派生类的实例并使用指针作为父类型指针时,才能进行向上转换。
发布于 2015-04-03 04:29:22
有几个问题
class A {
public:
// This needs to be a virtual function
void display() {
cout << "\nThis is in class A\n";
}
};void function2(A x) {
x.display();
}相反,使用下面的签名,然后这允许向上转换,就像一个指针。
void function2(A& x) {
x.display();
}如果继承是私有的,而不是公开的,那么第一个案例还会继续吗?
不,私人继承不是一种关系,而是一种在关系上实现的关系。此外,如果使用私有继承,则不会编译。
发布于 2015-04-03 04:43:32
这似乎是你问题中尚未得到回答的部分:
最后,如果继承是私有的,而不是公开的,那么第一个案例还会继续吗?我的意思是,现在,派生类对象不能作为基类对象来作为基类接口来处理。
如果尝试,您将看到派生类B中的成员函数能够在this上调用非会员void function(A* x); (就像成员函数可以为其他代码提供指针或对私有数据成员的引用一样)。
#include <iostream>
struct X { void f() { std::cout << "hello\n"; } };
void f(X* p) { p->f(); }
struct Y : private X { void g() { ::f(this); }};
int main()
{
Y y;
y.g();
}输出:
hello代码可用/可运行的这里
https://stackoverflow.com/questions/29426119
复制相似问题