就像,虚函数我们可以在 C++ 中使变量成为虚函数吗?
Like, virtual function can we make a variable virtual in c++
当基 class 指针指向派生的对象时 class 并且如果函数被重写,我们使用虚函数来解决问题。这样我们就可以使用指针访问derivedclass自己的函数了。
像这样,我在想,如果有一种方法可以应用于变量中的虚拟关键字,那么我们就可以使用指针访问派生 class 中变量的最新版本。
#include <iostream>
using namespace std;
class base
{
public:
int x;//but what about this , if we add virtual keyword here.
//it will give error if trying to do so .
//but can you tell me what can i do if i want to make use of it as virtual function
//if not please tell me why
virtual void display(void) //to call the recent version of display function we make use of virtual here
{
cout << "base\n";
}
};
class derived : public base
{
public:
int x;
void display(void)
{
cout << "derived\n";
}
};
int main(void)
{
base *p;
base ob1;
derived ob2;
p=&ob2;
p->x=100;//here i want to set 100 to the x of derived class not that x which has been inherited
//But it sets to the x of base class which i dont wanted
p->display();//here we can access the latest version of display function in derived class
return 0;
}
拜托,没有人问我为什么我想做 so.I 没有任何意图在我的真实代码中做。我问的好奇。
您不能使用 virtual
关键字覆盖成员变量。但是,您可以让 virtual
getter 和 setter 引用 不同的 基类成员变量和派生的 类 来实现类似的效果:
class base {
public:
virtual int getX() {
return x;
}
virtual void setX(int x) {
this->x = x;
}
private:
int x;
}
class derived : public base {
public:
int getX() {
return x;
}
void setX(int x) {
this->x = x;
}
private:
int x;
}
不,您不能将 virtual
用于字段,只能用于方法。
但是,您可以通过创建一个 returns 引用字段的函数来模拟:
class Base
{
private:
int x;
public:
virtual int& X() { return x; }
};
class Derived : public Base
{
private:
int x;
public:
virtual int& X() override { return x; }
};
int main()
{
Derived d;
Base* b = &d;
b->X() = 100; // will set d's x
}
其他答案完全没问题,但您也可以使用更简单的语法:
class base {
public:
virtual operator int&() { return x; };
virtual operator int() { return x; };
protected:
int x;
};
如果您希望在 class 中虚拟化单个变量。
第二个声明只是为了避免在您只需要值时使用引用,而在分配时会自动为您选择引用。
您可以根据从基派生的 classes 随意覆盖这些运算符。
class derived : public base {
public:
operator int() override { return x * 5; };
}
当基 class 指针指向派生的对象时 class 并且如果函数被重写,我们使用虚函数来解决问题。这样我们就可以使用指针访问derivedclass自己的函数了。 像这样,我在想,如果有一种方法可以应用于变量中的虚拟关键字,那么我们就可以使用指针访问派生 class 中变量的最新版本。
#include <iostream>
using namespace std;
class base
{
public:
int x;//but what about this , if we add virtual keyword here.
//it will give error if trying to do so .
//but can you tell me what can i do if i want to make use of it as virtual function
//if not please tell me why
virtual void display(void) //to call the recent version of display function we make use of virtual here
{
cout << "base\n";
}
};
class derived : public base
{
public:
int x;
void display(void)
{
cout << "derived\n";
}
};
int main(void)
{
base *p;
base ob1;
derived ob2;
p=&ob2;
p->x=100;//here i want to set 100 to the x of derived class not that x which has been inherited
//But it sets to the x of base class which i dont wanted
p->display();//here we can access the latest version of display function in derived class
return 0;
}
拜托,没有人问我为什么我想做 so.I 没有任何意图在我的真实代码中做。我问的好奇。
您不能使用 virtual
关键字覆盖成员变量。但是,您可以让 virtual
getter 和 setter 引用 不同的 基类成员变量和派生的 类 来实现类似的效果:
class base {
public:
virtual int getX() {
return x;
}
virtual void setX(int x) {
this->x = x;
}
private:
int x;
}
class derived : public base {
public:
int getX() {
return x;
}
void setX(int x) {
this->x = x;
}
private:
int x;
}
不,您不能将 virtual
用于字段,只能用于方法。
但是,您可以通过创建一个 returns 引用字段的函数来模拟:
class Base
{
private:
int x;
public:
virtual int& X() { return x; }
};
class Derived : public Base
{
private:
int x;
public:
virtual int& X() override { return x; }
};
int main()
{
Derived d;
Base* b = &d;
b->X() = 100; // will set d's x
}
其他答案完全没问题,但您也可以使用更简单的语法:
class base {
public:
virtual operator int&() { return x; };
virtual operator int() { return x; };
protected:
int x;
};
如果您希望在 class 中虚拟化单个变量。
第二个声明只是为了避免在您只需要值时使用引用,而在分配时会自动为您选择引用。
您可以根据从基派生的 classes 随意覆盖这些运算符。
class derived : public base {
public:
operator int() override { return x * 5; };
}