Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++通过指针访问基类派生类的方法?_C++_Inheritance - Fatal编程技术网

C++通过指针访问基类派生类的方法?

C++通过指针访问基类派生类的方法?,c++,inheritance,C++,Inheritance,假设我有一个基类和一个派生类,如下所示: //Base.h #pragma once class Base { public: Base(); ~Base(); private: int A; }; //Foo.h #pragma once #include "Base.h" class Foo : public Base { public: Foo(); ~Foo(); void setFoo(int number) { foo = numbe

假设我有一个基类和一个派生类,如下所示:

//Base.h
#pragma once
class Base
{
public:
    Base();
    ~Base();
private:
    int A;
};

//Foo.h
#pragma once
#include "Base.h"
class Foo : public Base
{
public:
    Foo();
    ~Foo();
    void setFoo(int number) { foo = number; };
private:
    int foo;
};
假设我声明了一个指向base的指针:

Base* BasePtr = new Foo();
如何使用此Base*Baseptr访问setFoo;变量 不使用虚拟方法可以实现吗? 在基础中有一个虚拟方法,却只能使用Foo自己的方法,这似乎是违反直觉的

我问这个问题的原因是我有一个赋值,它需要一个指向Base的指针数组,并且需要一种编辑派生类自身属性的方法

谢谢

这个怎么样:

Foo * p = new Foo();
p->setFoo(10);
Base * BasePtr = p;
或者:

Base * BasePtr = new Foo();
static_cast<Foo *>(BasePtr)->setFoo(10);
这个怎么样:

Foo * p = new Foo();
p->setFoo(10);
Base * BasePtr = p;
或者:

Base * BasePtr = new Foo();
static_cast<Foo *>(BasePtr)->setFoo(10);

在第一种方式中,我假设这需要在声明指向基数组的指针之前完成,或者每次我想要访问派生类的方法时都需要复制整个对象。至于其他的方法,如果它有效的话,很好,但是它有缺点吗?它重新解释\u cast的速度不是比静态\u cast更快吗?@EliasFinoli:我不确定你说的是哪种复制。在实际代码中,我会将逻辑封装到工厂函数中,在工厂函数中,第一种形式是完全自然的。@KerrekSB为什么不正确?如果您确信指针指向该派生类的对象,则可以强制将指针强制转换为指向基类的指针或指向派生类的指针。@Peregring lk:基子对象的地址不一定与包含该派生类的对象的地址相同,因此,指针转换可能需要偏移量调整。在第一种方式中,我假设这需要在向基数组声明指针之前完成,或者每次我想要访问派生类的方法时都需要复制整个对象。至于其他的方法,如果它有效的话,很好,但是它有缺点吗?它重新解释\u cast的速度不是比静态\u cast更快吗?@EliasFinoli:我不确定你说的是哪种复制。在实际代码中,我会将逻辑封装到工厂函数中,在工厂函数中,第一种形式是完全自然的。@KerrekSB为什么不正确?如果您确信指针指向该派生类的对象,则可以强制将指针强制转换为指向基类的指针或指向派生类的指针。@Peregring lk:基子对象的地址不一定与包含该派生类的对象的地址相同,因此,指针转换可能需要偏移量调整。如果需要了解派生类型,则会出现问题。您应该为类实现的接口编写代码,并使用接口指针。接口继承非常有用。如果需要知道派生类型是什么,则会遇到问题。您应该为类实现的接口编写代码,并使用接口指针。接口继承非常有用。