在C ++中上传

时间:2015-04-03 04:18:13

标签: c++

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

例如:

#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;
}

最后,如果继承是私有的而不是公共的,那么第一个案例仍然是upcasting吗?我的意思是,现在,派生类对象不能被视为基类对象作为基类接口现在输了。

3 个答案:

答案 0 :(得分:0)

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

所以两个印刷品都是A类。

Upcasting仅适用于父类型指针引用派生类的实例并将指针用作父类型指针的情况。

答案 1 :(得分:0)

有一些问题

class A {
public:
    // This needs to be a virtual function
    void display() {
        cout << "\nThis is in class A\n";
    }
};

以下原因导致对象切片,请参阅herehere

void function2(A x) {
    x.display();
}

而是使用以下签名,然后这允许upcast与指针一样。

void function2(A& x) {
    x.display();
}
  

如果继承是私有的而不是公共的,那么第一个案例是否会继续上传?

不,私有继承不是IS-A关系,而是根据关系实现。此外,如果使用私有继承,则无法编译。

答案 2 :(得分:0)

这似乎是你问题仍然没有答案的部分:

  

最后,如果继承是私有的而不是公开的,那么第一个案例是否还在继续?我的意思是,现在,派生类对象不能被视为基类对象,因为现在丢失了基类接口。

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

#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

代码可用/可运行here