首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的升压

C++中的升压
EN

Stack Overflow用户
提问于 2015-04-03 04:18:12
回答 3查看 465关注 0票数 0

我知道它使用的是派生类对象的地址,其中需要基类对象的地址。

例:

代码语言:javascript
复制
#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使用的是派生类的对象,其中需要基类的对象吗?(请注意,我省略了此处的地址一词)

代码语言:javascript
复制
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;
}

最后,如果继承是私有的而不是公共的,那么第一种情况是否仍然是--我的意思是,现在,派生类对象不能作为基类对象作为基类接口来处理。

EN

回答 3

Stack Overflow用户

发布于 2015-04-03 04:23:45

当调用第二个function2时,创建A类型的实例(这是function2的参数x),并从B类型的b中分配(或复制)。

所以这两张都是A级的。

只有当父类型指针引用派生类的实例并使用指针作为父类型指针时,才能进行向上转换。

票数 0
EN

Stack Overflow用户

发布于 2015-04-03 04:29:22

有几个问题

代码语言:javascript
复制
class A {
public:
    // This needs to be a virtual function
    void display() {
        cout << "\nThis is in class A\n";
    }
};

以下原因导致对象切片(请参阅这里这里 )

代码语言:javascript
复制
void function2(A x) {
    x.display();
}

相反,使用下面的签名,然后这允许向上转换,就像一个指针。

代码语言:javascript
复制
void function2(A& x) {
    x.display();
}

如果继承是私有的,而不是公开的,那么第一个案例还会继续吗?

不,私人继承不是一种关系,而是一种在关系上实现的关系。此外,如果使用私有继承,则不会编译。

票数 0
EN

Stack Overflow用户

发布于 2015-04-03 04:43:32

这似乎是你问题中尚未得到回答的部分:

最后,如果继承是私有的,而不是公开的,那么第一个案例还会继续吗?我的意思是,现在,派生类对象不能作为基类对象来作为基类接口来处理。

如果尝试,您将看到派生类B中的成员函数能够在this上调用非会员void function(A* x); (就像成员函数可以为其他代码提供指针或对私有数据成员的引用一样)。

代码语言:javascript
复制
#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();
}

输出:

代码语言:javascript
复制
hello

代码可用/可运行的这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29426119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档