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:基子对象的地址不一定与包含该派生类的对象的地址相同,因此,指针转换可能需要偏移量调整。如果需要了解派生类型,则会出现问题。您应该为类实现的接口编写代码,并使用接口指针。接口继承非常有用。如果需要知道派生类型是什么,则会遇到问题。您应该为类实现的接口编写代码,并使用接口指针。接口继承非常有用。